Newsgroup: it.comp.lang.visual-basic
Titolo: Shell

VB6
 
Dopo aver verificato che il file sia presente, ho questa istruzione:
ret = Shell(App.Path & "\Update.exe", vbNormalFocus)
che ritorna qusto errore:
Errore:5-Chiamata di routine o argomento non valido.
Il problema si verifica su un solo pc, cosa può essere? Grazie
 
-- 
Greg
 
 

Il 19/08/15 13:36:27 Greg ha scritto:

Ho modificato nel modo seguente ma l'errore permane:
file = App.Path & "\Update.exe"
    If Dir(file) <> "" Then
        q4 = Shell("C:\windows\system32\calc.exe", 1)
        q5 = Shell(file, 1)
    End If
 
La prima chiamata va a buon fine, la seconda da errore n.5, eppure 
l'argomemento è passato allo stesso modo, il file esiste, non so piu 
cosa guardare.
 
Ho provato anche a cancellare il codice, chiudere il progetto e poi 
riscriverlo di nuovo.
 
Qualche idea? Grazie
 
-- 
Greg
 
 

App.Path & "\Update.exe"
 
Una possibilità: questa concatenazione ha sempre il potenziale problema che se l'applicazione chiamate è nella radice di una unità, genera un percorso non valido (App.Path ritorna "X:\" in quel caso, con l'ovvio errore)
 
In alternativa, problemi di autorizzazioni all'esecuzione di quel file specifico?

 specifico?
 
Forse è questa! Ho chiesto di provare a fare direttamente doppio clik 
sul file Update.exe e si apre la finestra: Consentire al programma 
seguente con autore sconosciuto di apportare modifiche la computer?
e chiede la pass di amministratore.
 
E cosi si capisce e uno mette la pass, mentre da codice da l'errore di 
run-time 5, criptico. C'è un modo per superare il blocco da codice?
In ogni caso grazie
 
-- 
Greg
 
 

 In ogni caso grazie
 
Prendila con le molle, non ho tempo di provarla, ma forse con un file
nominato "UPDATE.exe.manifest"  dove indichi:
 
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
| <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
| <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="UPDATE" type="win32"/>
| <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|  <security>
|                <requestedPrivileges>
|                    <requestedExecutionLevel
|                        level="asInvoker"/>
|                </requestedPrivileges>
|          </security>
|       </trustInfo>
|   </assembly>

 q5 = Shell(file, 1)
 
quell'uno e' vbNormalFocus, cioè impone di attivare la finestra (che 
NON
si attiva perchè compare il prompt di autorizzazione UAC) e quindi
genera un errore come se l'applicazione non fosse partita (invece e' in
attesa del dialogo UAC).
 
Dopo vari smadonnamenti risolsi cosi:
 
    file = App.Path & "\Update.exe"
    If Dir(file) <> "" Then
 
       On error resume next
        q5 = Shell(file, 1)
       On error goto 0
 
 
    End If
 
Poco elegante ma funzionante.

Il 19/08/15 16.19.06 Andrea (Work) ha scritto:

Grazie Andrea, ma non esco dall'errore, è come se non ci fosse
 
-- 
Greg
 
 

Il 19/08/15 18.57.55 Franz_aRTiglio ha scritto:

Grazie Franz, non mi da l'errore, ma Update non viene mai eseguito.
Adesso sono sulla macchina di sviluppo, xp come amministratore, quello 
che non capisco è:
- perchè prima funzionava e adesso no
- perchè lancia Calc.exe e non Update.exe
Mai successa una cosa del genere, non so che pesci prendere :(
 
-- 
Greg
 
 

 attesa del dialogo UAC).
 
A me che sia normalfocus non interessa.
L'importante è che Update esegua 2 sole semplici istruzioni:
- copy il programma nuovo sul vecchio
- lo mandi inesecuzione con un altra funzione shell
 
Purtroppo non va bene con nessun parametro, neanche vbHide, e neanche 
senza parametri del tutto. E' un bel mistero
 
-- 
Greg
 
 

 parametri del tutto. E' un bel mistero
 
'spe... frena:
 
stai cercando di lanciare un "update.exe", ho capito bene ? il VECCHIO
programma lancia il programma che lo deve sostituire ?
 
Se ho capito bene allora non e' un problema di UAC, il problema
e' che il VECCHIO programma è in esecuzione mentre il NUOVO tenta di
sovrascriverlo!
 
Se invece ho capito male, a 'sto punto proverei a lanciare explorer.exe
specificandogli l'exe da lanciare come parametro
 
https://support.microsoft.com/en-us/kb/130510
 

 sovrascriverlo!
 
Mi hai fatto accendere la lampadina!!!
C'era un timer che aspettava che VECCHIO chiudesse prima di 
sovrascrivere. Chissà perchè, non ricordavo piu a cosa serviva l'ho 
tolta, per rendere il codice piu chiaro :( Me tapino
 
-- 
Greg
 
 

 programma lancia il programma che lo deve sostituire ?
 
 
Ho ritornato le cose come stavano prima, Update funziona bene in 
modalità progettaizone ma il compilato, appena lanciato mi da un altro 
errore strano:
Impossibile avviare l'applicazione. La configurazione dell'applicazione 
non è corretta. Una nuova installazione potrebbe risolvere il problema.
 
Ho cercato con google ma non ci sono occorrenze di qusto errore nel 
mondo vb6. Hai per caso qualche idea delle tue? Io ormai ho la mente 
offuscata da una giornata di stress :(
 
-- 
Greg
 
 

 una giornata di stress :(
 
Trovato: il file manifest da fastidio :(
Basta, chiudo e vado a dormire.
Grazie della dritta Franz :)
 
-- 
Greg
 
 

 Grazie della dritta Franz :)
 
:)
 
Comunque, la prossima volta ti conviene fare come segue:
Il programma che deve aggiornarsi usando l'api "GetCurrentProcessId"
ottiene il proprio ProcessId (che e' univoco), lancia l'updater
passandogli il ProcessId come parametro e si chiude; l'updater 
controlla
la lista dei programmi in esecuzione fino a che il ProcessID non
scompare (il programma si è chiuso), e solo allora interviene.
 
In questo modo non hai problemi di timer o di ritardi in chiusura
causati da programmi esterni (tipo antivirus)...

 causati da programmi esterni (tipo antivirus)...
 
E invece il problema c'è lo stesso, perchè .... ho fatto queste prove:
Prima di andare udare un bel po di api per sapere se il ProcessID è 
ancora in funzione ho fatto delle prove piu semplici e immediate:
- ho inibito ogni operazione dell'Updater, solo lo show della form, col 
chiamante  NON in esecuzione, visto che lo lancio manualmente, 
incredibile mi da errore 5;
- ho rifatto ex novo l'updater, ricompilato e cambiato nome in 
prova2.exe, lo lancio manualmente e va bene nel senso che lancia il 
programma aggiornato e si chiude; lo rinomino in Update.exe oppure in 
provaUpdate.exe e compare la richiesta pass amministratore! Questa cosa 
mi sfugge, sembra che la parolina Update nel nomeprogramma non sia più 
gradita per qualche strano motivo!
 
-- 
Greg
 
 

 Update nel nomeprogramma non sia più gradita per qualche strano motivo!
 
Idem con "install" e "setup" altri similari, la cosa e' VOLUTA da
windows vista in poi per aggirare (pateticamente) la problematica di
intercettare programmi che pur non usando registry e/o percorsi
riservati/di sistema e/o windows installer.
 
anche se compili il piu stupido degli "hello world" ma lo nomini
come setup install update ecc. quando parte invoca l' UAC.