Newsgroup: it.comp.lang.visual-basic
Titolo: Live Update e problemi con Win98/Me

Ciao.
Ho finamlente portato a termine il "live update" per un mio programma, che
mi consente di rilasciare aggiornamenti sia del database che del programma
con un click, scaricandoli da un server Web.
Funziona perfettamente, almeno mi pareva fino a ieri...
Infatti mi sono accorto solo ora, a lavoro terminato, che sia su Win98 che
su WinMe ho un errore 75 "Errore di accesso al percorso/file" durante
l'aggiornamento e più precisamente quando vado a sostituire l'eseguibile
stesso con il nuovo appena scaricato.
Mi spiego meglio: prima di iniziare il lavoro, ho trovato proprio su questo
ng una soluzione molto semplice per far aggiornare l'eseguibile da se
stesso, senza dover ricorrere ad un updater esterno:
Name App.Path & "\mioexe.exe" As App.Path & "\mioexe.old"
Name App.Path & "\nuovoexe.exe" As App.Path & "\mioexe.exe"
Tutto questo con lo stesso eseguibile, che quindi si "sovrascrive".
L'unica cosa che deve fare l'utente è chiudere l'applicazione e riavviarla,
in modo da ricaricare l'eseguibile nuovo . E funziona, ma solo con XP.
Con Win98 e Me (non ho provato NT e 2000) nisba: mi becco l'errore 75 sulla
prima istruzione.
Idem se utilizzo il FileSystemObject, solo che mi becco un 70
"Autorizzazione Negata".
Azzardo un'ipotesi: XP, NT e 2000 utilizzano un file system diverso da
Win98/Me e caricano in memoria l'eseguibile subito e completamente,
chiudendolo e rilasciandolo una volta caricato. Win98/Me hanno bisogno
invece di attingere anche durante l'esecuzione dal .exe, da qui l'errore di
"file impegnato".
Ha un senso tutto ciò ??
Secondo voi è aggirabile l'ostacolo senza dover ricorrere ad un (programma ?
batch ?) esterno che mi elimini l'eseguibile vecchio e rinomini quello nuovo
?
Paolo

 ?
Soluzione semplice, ma limitante: non supportare Win9x/ME (eheheh...)
Soluzione brutale, ma efficace:
1) messagebox "Per completare l'aggiornamento verrà riavviato Windows" etc...
(tipico in Win9x/ME)
2) creazione file C:\WINDOWS\WININIT.INI contenente il seguente testo:
[rename]
c:\...\nuovoexe.exe=c:\...\mioexe.exe
3) riavvio forzato mediante l'API ExitWindows
Altrimenti ho paura che non si scappi: ti serve per forza un "bootstrapper"
esterno (bat o programma) perché il tuo exe per poter essere sovrascritto deve
terminare.
Bye
Raf

 Paolo
Andrea



Vero, ci avevo pensato, ma superficialmente immaginavo che fosse per poter
gestire aggiornamenti complessi. Mi sbagliavo...

 terminare.
Temo anch'io...
Il batch non è molto bello esteticamente, inoltre dovrei inserire
un'istruzione "PAUSE" per consentire all'applicazione di chiudersi subito
dopo averlo lanciato, altrimenti ho sempre lo stesso problema... mi pare un
po' una schifezza avere la finestra nera stile DOS, però non avrei (credo!)
problemi con firewall ed antivirus vari. (Mi confermate vero che un .bat
lanciato da un'applicazione non viene bloccato dai fw ?)
Oppure potrei fare un programma con un banale modulo contenente 3 righe di
codice che fa la rename, rilancia l'eseguibile e si chiude, previo avviso
che il programma si riavvierà.
Con questa soluzione, senz'altro più elegante, l'unico dubbio che ho è che i
vari firewall tipo Norton si incazzino e sia necessario da parte dell'utente
un intervento manuale per consentirne l'esecuzione.
Che casino!

 un intervento manuale per consentirne l'esecuzione.
Dici "incazzature" del tipo "L'applicazione X sta tentando di avviare
l'applicazione Y. Consentire l'esecuzione?", giusto?
Non so se a questo livello valga la pena preoccuparsi, altrimenti cosa
bisognerebbe fare in tutti i programmi costituiti da più eseguibili?
Al limite l'utente dovrà dare il suo assenso, non penso sia un grosso problema,
non è così?
Ciao
Raf

[SNIP]
Chiedo scusa per il cut selvaggio ma vado di fretta =)
------------------------------------------------------------
*Premessa*
Il procedimento si basa sul meccanismo:
1) MioProgramma.exe lancia Update.exe
2) MioProgramma.exe si chiude
2) Update.exe attende la chiusura di MioProgramma.exe
3) Update.exe aggiorna MioProgramma.exe (oppure Annulla)
4) Update.exe lancia MioProgramma.exe
5) Update.exe si chiude
------------------------------------------------------------
*Premessa2*
App.Path e' bastardo con i percorsi, usero' pertanto la
funzione AppPath:
Public Function AppPath() As String
    With App
        AppPath = IIf(Right$(.Path, 1) = "\" Or _
                      Right$(.Path, 1) = "/", _
                      .Path, .Path & "\")
    End With
End Function
------------------------------------------------------------
*Update.exe*
Scrivi un programma di aggiornamento con un bel form con
label "Aggiornamento in corso" ed un pulsantone "Annulla".
Una variabile a livello di modulo (form):
'----- CODICE -----
Private PremutoTastoAnnulla As Boolean
'------------------
nella Sub cmdAnnulla_Click():
'----- CODICE -----
PremutoTastoAnnulla = True
'------------------
e nel Form_Load:
'----- CODICE -----
Call Me.Show
Do While MioProgrammaInEsecuzione() And _
         Not PremutoTastoAnnulla
    DoEvents
Loop
If PremutoTastoAnnulla Then
    Call EseguiMioProgramma()
    Call Unload(Me)
    Exit Sub
End If
Name AppPath & "MioProgramma.exe" As _
     AppPath & "MioProgramma.old"
Name AppPath & "MioAggiornamento.exe" As _
     AppPath & "MioProgramma.exe"
Call EseguiMioProgramma()
'------------------
Lascio a te la scrittura della funzione EseguiMioProgramma
(API ShellExecute) e di MioProgrammaInEsecuzione.
Per la seconda puoi usare una delle API che contengono la
parola "Process" :-P ora non ricordo meglio :)
In ogni caso, qui ci sono alcuni metodi per verificare se
il programma è in esecuzione a partire dal percorso:
http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_21584451.html
------------------------------------------------------------
*MioProgramma.exe*
Nella routine di aggiornamento, esegui Update.exe (API
ShellExecute) e poi termina il software.
Se serve, puoi passare il percorso di MioProgramma.exe ad
Update.exe come parametro (e potrai leggerlo dal programma
Update con la funzione Command()).
hth,
Lokar
P.S. Meno male che andavo di fretta :P

 non è così?
Si, hai perfettamente ragione, ma ti giuro che mi sono arrivate e-mail di
utenti che non ne andavno fuori neanche con il solo programma... manco
sapevano di aver installato il pacchetto Notron Internet Security :-|
U: (cit. messaggio competo): "Il programma non funziona, cosa può essere?"
(...)
Io: Hai un firewall installato ?
U: Fire che ?...
Paolo

 P.S. Meno male che andavo di fretta :P
LOL.. Sei stato gentilissimo, grazie!
Paolo

 Ci dovevo ancora pensare... ma la risposta è a pagamento ? o_O
Scorri la pagina in basso... sotto la pubblicita'!
Lokar 

Noto con disappunto che non e' piu' visibile la risposta...
Vai di google cache :)
http://66.249.93.104/search?q=cache:HMzLSu9eeloJ:www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_21584451.html
Lokar 


http://66.249.93.104/search?q=cache:HMzLSu9eeloJ:www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_21584451.html
Ottimo, grazie ;-)

 Paolo
Andrea