Newsgroup: it.comp.lang.visual-basic
Titolo: Aggiornamento Ocx via IE

Il subject è fuorviante, ma non trovavo di meglio.
Sviluppando applicazioni UserControl ActiveX, le distribuisco generalmente
attraverso IE, appoggiando l'Ocx su una pagina HTML.
Nel Cab, a volte inserisco dei file di supporto (font, Ini, Xlt, ecc...),
che poi l'Ocx utilizzerà individuandoli con App.Path, visto che saranno
estratti dal Cab direttamente a cura di IE.
Se modifico l'Ocx, ne cambia la versione, e ricreando il pacchetto avviene
una nuova estrazione nel client di tutti i file, compresi i file di
supporto. Se invece modifico un file di supporto, e ricreo il pacchetto
senza modificare l'Ocx, l'Eplorer del client utilizza quello già in cache, e
non esplode il Cab.
Qualcuno conosce il modo per indicare a IE che qualcosa è cambiato nel Cab,
anche se l'Ocx è ancora lo stesso (e quindi tutti i riferimenti nell'html
sono identici a prima)?
Ciao e grazie
Alberto

 anche se l'Ocx č ancora lo stesso (e quindi tutti i riferimenti nell'html


 CAB... ma komporta moltissime kose...
Questo è l'approccio classico, che utilizzo da sempre, e che scarica il file
di configurazione all'avvio dell'applicativo. Per alcuni file, invece, e per
motivi troppo lunghi da spiegare, preferivo che alcuni file fossero nel Cab
e venissero estratti da IE.
Ma se cambio un file e non l'Ocx, all'avvio successivo dell'Ocx il client
non scarica i nuovi file.
Ciao
Alberto


se non ti interessa rikarikare il tutto kosa ti kosta rikompilare l'ocx ?
JhonnyMC

 se non ti interessa rikarikare il tutto kosa ti kosta rikompilare l'ocx ?
Ricompilare richiede Visual Basic, mentre ricreare il pacchetto no.
Se io dò al cliente l'OCX e i file di supporto, lui potrà a suo piacimento
modificare i file di supporto, poi ricreare il pacchetto e metterlo on-line.
Se invece deve ricompilare, deve comprare una licenza di VB e tenere anche
allineato il sistema con i SP, ecc...
Se non c'è modo di automatizzare la cosa, dovrò chiedere all'utente di
eliminare la registrazione dell'Ocx dai file temporanei di IE, così al primo
riavvio si reinstalla, ma è un poccio che non mi piace proprio.
Ciao
Alberto

 non scarica i nuovi file.
umm umm fare un pacchetto tipo OCX_DATA_ORA.cab ?
naturalmente per avevre un riferimento standard dovresti creare una pagina
HTML con una storia del cab tipo:
20_11_2002_13_58_OCX.cab
19_11_2002_17_00_OCX.cab
18_11_2002_01_00_OCX.cab
15_11_2002_13_58_OCX.cab
ecc..
cosi leggi il primo campo , lo confronti con un log del programma e se sono
diversi scarichi l'agg !
Pseudo Es:
[Avvio Programma]
[carica pagina html]
....
mio_ocx =  "18_11_2002_01_00_OCX.cab"
ocx_in_rete = Get nome da pagina HTML
if mio_ocx <> ocx_in_rete then
    scarica  (ocx_in_rete)
    after install scrivi_su_log (ocx_in_rete)
else
    msgbox "Tutto aggiornato capo!!!"
....
la pagina HTML deve avere un expiried molto breve ( 1gg )  in modo che ogni
volta che la si chiami si ricarichi di nuovo
Che te ne pare come idea ?

 Che te ne pare come idea ?
Non ti seguo.
Il codice che hai postato, in quale applicativo potrebbe eseguire?
Perchè mi sfugge la sequenza del tuo esempio:
Tu dici:
[Avvio Programma]
[carica pagina html]
....
mio_ocx =  "18_11_2002_01_00_OCX.cab"
ocx_in_rete = Get nome da pagina HTML
if mio_ocx <> ocx_in_rete then
    scarica  (ocx_in_rete)
    after install scrivi_su_log (ocx_in_rete)
else
    msgbox "Tutto aggiornato capo!!!"
....
Ma la sequenza esatta è:
[Carica pagina html]
[Confronta Versioni OCX]
[If versione_in_cache_non_aggiornata then]
    [Scarica_CAB
    Estrai_File
    Registra Componenti
    Registra OCX nuovo]
[Avvio Programma]
E quindi il codice andrebbe eseguito qui, ma ormai l'installazione è già
avvenuta.
Il discorso di utilizzare CAB con nomi diversi può andare benissimo,
cambiando il CodeBase nella pagina Html, ma il numero di versione deve
essere congruente con quello dell'OCX, e se il numero di versione riportata
nell'HTML è lo stesso di quella in cache di explorer, il CAB viene ignorato
(ed è qui il problema).
Infatti, l'OCX Bomber versione 1.0.1 (è ovviamente un esempio), richiede
nell'HTML
<OBJECT ID="Bomber"
CLASSID="CLSID:BE0X28C4-380A-4D27-870F-X98FADBBE767"
CODEBASE="Bomber.CAB#version=1,0,0,1">
</OBJECT>
Se io non ricompilo l'OCX (che quindi rimane Bomber 1.0.1), ma semplicemente
modifico file aggiuntivi inseriti nel CAB, IE non ha modo di scoprire che
qualcosa è cambiato, per cui non effettua il download del Bomber.CAB, e i
file rimangono alla versione precedente.
Comunque, ho scoperto che la creazione del pacchetto, anche senza
ricompilare, richiede comunque una licenza di VB, per cui dovrò comunque
dare al cliente una licenza VB. Tuttavia, non richiedendo una vera
compilazione, non dovrò dargli nè i sorgenti nè richiedere che si mantenga
allineato con i SP.
Per i file di supporto, se non si trova una soluzione, continuerò ad
effettuarne il download al bisogno, direttamente in run-time.
Ciao
Alberto

 file rimangono alla versione precedente.
bene , nell html-log scrivi che e' uscita una nuova versione e il tuo ocx
verra' scaricato automaticamente !!!

 [If  NomeFile_che_ho_isatllato < NomeFile_in_rete then]
Pur non avendo tutto chiarissimo del tuo suggerimento, ho provato a fare
come dici tu:
Ho creato un OCX di prova (Progetto1.UserControl1), ho inserito nel
pacchetto un prova.txt, e ho creato il pacchetto Progetto1_20021119 (ossia
come se fosse stato scaricato ieri).
Ho inserito nell'html il nome Progetto1_20021119 nel CodeBase, e tutto si č
installato correttamente.
Poi, ho modificato prova.txt, ho ricreato il pacchetto, lasciando comunque
l'OCX alla versione 1.0.0, e ho rinominato il pacchetto in
Progetto1_20021120, inserendo tale nome nel codebase.
Dal client, il Cab non viene estratto, perchč IE vede che il ClassID e la
version sono identiche, per cui non ritiene di dover aggiornare la cache.
Allora, ho fisicamente eliminato dalla cache la pagina HTML, visto che tu
suggerivi di abbassarne la durata, e sono tornato ad accedere al sito web.
Anche stavolta Explorer non ha ritenuto di dover estrarre il CAB, e ha
ignorato le modifiche.
Alchč, ho tolto manualmente dalla cache anche il CAB precedente, e stavolta
ha estratto il nuovo CAB, ma questo č il comportamento solito. Ha estratto
il CAB perchč non ne ha trovato nessuno, non perchč il nome era diverso.
Ho l'impressione che l'installer di IE ignori del tutto il nome del CAB, e
valuti esclusivamente il ClassID e la version.
Il codice HTML č:
<OBJECT ID="UserControl1"
CLASSID="CLSID:F3AC67DA-2813-4B6F-80C4-143412EC3803"
CODEBASE="Progetto1_20021120.CAB#version=1,0,0,0">
Tornando al tuo post, il passaggio:
If  NomeFile_che_ho_isatllato < NomeFile_in_rete then
sarebbe risolutivo, ma come posso imporre all'installer di IE di seguire
questa logica, se mi risulta che la sua logica sia diversa?
Ciao e grazie
Alberto

Parlo (scrivo) da profano, ma se tu nella pagina html gli imponi di
non utilizzare la cache con:
<HTML>
<HEAD>
<META HTTP-EQUIV='Pragma' CONTENT='no-cache'>
<META HTTP-EQUIV='Cache-Control' CONTENT='no-cache'>
.
.
.
Potrebbe funzionare ? Tieni presente che ad ogni reload ti
ricaricherebbe il cab.....
--
(¯`·.¸¸.·´¯`·.¸¸.-> Daniele <-.¸¸.·´¯`·.¸¸.·´¯)

 non utilizzare la cache con:
Per scrupolo ho provato, ma non va. Considera che io sto parlando della
cache degli oggetti, non dei file (Strumenti->Opzioni->Visualizza File o
Visualizza Oggetti, sono due cache diverse).
Ciao
Alberto

 questa logica, se mi risulta che la sua logica sia diversa?
Bha , misteri di ie , per curiosita' anche gli altri si comportano cosi ?
(mozilla) (opera) ecc ?