Oppure

Loading
02/02/09 11:05
ottobits
Salve a tutti,
qualcuno mi sa spiegare per quale motivo un argomento passato ad un programma tramite contestuale, a volte causa il RUN dell'argomento?
Mi spiego. Ho il mio prog.exe che accetta i nomi dei files passati come argomento tramite la chiave di registro:
shell/command "c:\mioprog\prog.exe" "%1"
A volte succede che il contenuto della variabile %1 viene lanciato da windows.
Esempio (puramente indicativo):
shell/command "c:\mioprog\prog.exe" "%1"
%1 contiene winamp.exe perchè è stato selezionato dalla voce context menu di prog.exe. In pratica la stringa composta dal context è:
"c:\mioprog\prog.exe" "c:\winamp.exe"
A volte parte anche winamp.exe, ed è assurdo che cio avvenga, in quanto il programma main è prog.exe, mentra winamp.exe è solo un argomento all'interno della variabile %1. Perchè a volte winamp.exe (o qualsiasi altro file...) viene lanciato da windoze?
Ringrazio anticipatamente coloro che sapranno spiegarmi ed ovviare a questo problema.
Ciao! :)
Ultima modifica effettuata da ottobits 02/02/09 11:08
aaa
02/02/09 16:01
GrG
ehm...non ti ho capito bene...
shell/command ??? (mai visto xD)
aaa
02/02/09 16:19
Overflow
ma il tuo scopo quale è? perchè passi come parametro diun programma, un altro programma?
Comunque se prog.exe è un programma fatto da te, posta il codice. Comunque spiega quello che vuoi fare.

se non erro shell/command "c:\mioprog\prog.exe" "%1" io l'ho utilizzata per associare un estensione di un file, ad un mio programma, in questo modo un file con estensione .asd per esempio associato al mio programma, apre il mio programma quando tendo di aprire questo file.
Ultima modifica effettuata da Overflow 02/02/09 16:23
aaa
02/02/09 17:43
ottobits
Ciao e grazie per le risposte!

il programma fa una operazione sul file che viene passato come parametro, ovverosia, lo critta o compatta:
mioprog.exe "%1"
apre "%1" in modo binary ed esegue la crittazione/compressione (get#, put#) appoggiandosi a una cartella temporanea. Quindi non è lui a lanciare "%1". Sta di fatto che a volte l'argomento "%1" fallisce, il mioprog.exe si apre, ma "%1" è stato intercettato da windows che esce fuori con l'avviso che si sta tentando di aprire (RUN) una applicazione potenzialmente dannosa. Ma io non gli ho dato il Run, l'ho semplicemente passato come argomento al mio programma via context menu!
E' una baco di windows? Succede anche per un'altro piccolo applicativo (non fatto da me) che ho installato nel context menu (calcola il crc32 del file che gli passi via "%1". Anche lui soffre di questo problema e a volte windows tenta di lanciare il programma che è solo passato come argomento. Ma non succede solo per gli eseguibili, puo accadere anche per files diversi come mpg. In questo caso (a volte) parte windows media player :-o

E' probabile che il problema sia insito nella chiave di registro del context menu che ho fatto, cosi com'è per l'altro programma che calcola il crc. Infatti selezionando un file con tasto destro e andando poi si (per esempio) winrar add file (o winzip), winrar.exe prende anche lui "%1" ma windows non si intromette mai nell'operazione. Da questo deduco che il problema sia da imputarsi a come viene costruita la estensione nel context menu.
Non so, è una ipotesi...

Edit: Non fare più post di seguito...il pulsante edit è fatto apposta :k:
Ultima modifica effettuata da GrG 02/02/09 18:47
aaa
02/02/09 18:23
theprogrammer
Non si e' ancora capito quale sia il codice del tuo programma ... mostralo chiaramente.
aaa
02/02/09 19:14
ottobits
Ok, scusate se ho fatto due post di seguito, ma mi concederete un On Error dat che sono nuovo qui :)
Il codice è troppo complesso per essere postato, però questo è un esempio altrettanto valido, in cui si puo incorrere nel RUN non voluto da parte di windows:

Private Sub Form_Load()
Dim cLine As String, b As Byte
cLine = Command$
' tolgo gli apici " che arrivano dalla context
cLine = (Mid$(cLine, 2, Len(cLine) - 2))
' cline è il nome completo del file con la path
Open cLine For Binary As 1
Do
Get #1, , b
' elabora b
Loop Until Loc(1) = LOF(1)
Close 1
end
End Sub

Compilare con nome Mioprog.exe e metterlo in una cartella in C:\Mioprog

Chiave di registro:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\MioProg fai quello che devi]

[HKEY_CLASSES_ROOT\*\shell\MioProg fai quello che devi\command]
@="\"C:\Mioprog\Mioprog.exe\"\"%1\""

Ora il programma è comandabile dalla context menu; basta selezionare il file col tasto destro e selezionare "MioProg fai quello che devi".
Selezionando piu files, si incorre nell'errore che ho menzionato sopra, cioè Windows può uscire fuori con una richiesta di Run del file contenuto nella variabile %1, che invece deve essere normalmente passata a Mioprog.exe, che la riceverà su Command$ e poi filtrata su cLine.
Ultima modifica effettuata da ottobits 02/02/09 19:17
aaa
02/02/09 19:28
theprogrammer
Ok ... ora dacci anche un suggerimento concreto su come replicare il problema perche' ho compilato il codice e ho fatto tutto quanto ma non si e' mai presentato il problema ... magari ci dai un suggerimento preciso e cosi' si nota l'errore ...

P.S. Un programma non si termina MAI con End, per tutta una serie di motivi che sarebbe troppo lungo da elencare ... anche nel tuo caso, elimina la End e inserisci al suo posto una

Unload Me
aaa
02/02/09 19:39
ottobits
Si, era solo un esempio fatto al volo... Cmq se hai inserito anche la chiave di registro dovresti avere la voce nel menu contestuale. Vai in una cartella dove hai dei files non lockati da altri processi (preferibilmente dei files che usi per fare dei test...), li selezioni tutti e col tasto destro li dai in pasto al programma compilato. Si avviano diversi processi (ovviamente) e vedrai che prima o poi salta fuori una richiesta di run di un applicativo passato come argomento (un file che hai in quella cartella) oppure parte media player se per esempio è un file mpeg. So che è un po complesso da spiegare, ma il problema si presenta, non tanto sul mio sistema dove ho il sistema di sviluppo, ma in quelli dove vado ad eseguire una nuova installazione del programma.
aaa