Newsgroup: it.comp.programmare.win32
Titolo: CreateProcess

Ciao a tutti!
Sto lavorando ad un programma in C++ usando MSVC 7.1 e nel mio
programma, ad un certo punto, devo vedere un filmato.
Ho usato questo codice:
STARTUPINFO si;
			 PROCESS_INFORMATION pi;
			ZeroMemory( &si, sizeof(si) );
			si.cb = sizeof(si);
			ZeroMemory( &pi, sizeof(pi) );
		 // Start the second updater process. 
			if(!CreateProcess( "C:\\Programmi\\Windows Media
Player\\wmplayer.exe",    // No module name (use command line).
				"/open  viewmsg.itemMovie",     // Command line.
            NULL,               // Process handle not inheritable. 
            NULL,               // Thread handle not inheritable. 
            FALSE,              // Set handle inheritance to FALSE. 
            CREATE_NEW_CONSOLE, // Give the process it's own console
            NULL,               // Use parent's environment block. 
            NULL,               // Use parent's starting directory. 
            &si,                // Pointer to STARTUPINFO structure.
            &pi )             // Pointer to PROCESS_INFORMATION
structure.
			)
{
				 printf( "CreateProcess failed (%d).\n", GetLastError() );
				return;
			}
			// Wait until child process exits.
			WaitForSingleObject( pi.hProcess, INFINITE );
			// Close process and thread handles. 
			CloseHandle( pi.hProcess );
			CloseHandle( pi.hThread );
dove viewmsg.itemMovie e' il path per il filmato (e ho verificato che
funzioni, quindi per quello non ci sono problemi).
La mia domanda e' questa: ora io ho specificato il path completo per
raggiungere wmplayer, ma e' possibile che l'applicazione venga usata
anche su OS di lingua non italiana (dove quindi wmplayer e' installato
in un'altra directory), come posso fare?
E' sufficiente utilizzare wmplayer.exe invece del path?
Grazie, 
Arianna
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Arianna
ciao

 


 (devo essere impedita io ;D)
insisti con ShellExecute, il modo + corretto è quello! ;) anche perché
CreateProcess sinceramente mi sembra di una complicatezza che è un po'
fuor di luogo in questo contesto... :PPP
quello che devi fare è chiedere alla shell di aprire un filmato
utilizzando il programma predefinito associato alla sua estensione, e
ShellExecute è questo che fa; certo, potrebbe anche verificarsi che il
filmato è in un formato sconosciuto (cioè sul pc non è installato nessun
media player in grado di leggere i wmv), ma allora che ci puoi fare, non
vorrai mica metterti tu a scrivere un lettore wmv, no? :P
piuttosto, vedendo che la ShellExecute fallirà, mostrerai un opportuno
messaggio di errore.
se non riesci a far funzionare la ShellExecute, posta la chiamata che hai
fatto che forse ti si può aiutare.
cia'
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 cia'
ShellExecute(NULL, "open", "c:\fre1.wmv", NULL, NULL, 1);
Eccola qua, ovviamente il file e' in c:
Se metto al posto di c:\fre1.wmv c:\\Programmi\\Windows Media
Player\\wmplayer.exe" mi apre wmplayer.
(l'ho messo solo per vedere se stessi facendo qlc di corretto!)
Grazie!
Arianna


 Arianna
Ah, credo di aver parzialmente risolto il problema.
cioe', invece di avere "\" nel path ho usato "/".
Ora, pero' ho alcune domande da fare!!!
Uno, se io ho la mia applicazione in una specifica locazione (ad
esempio, c:\development\miaapplicazione.exe")
ed e' dentro questa applicazione che io lancio shellexecute.
Il file video che voglio aprire e' in c:\development\movie\file.wmv,
posso
semplicemente usare come path /movie/file.wmv? o //movie//file.wmv?
Oppure devo
dargli il path completo (c://development etc.etc.)?
Se io lo passassi come variabile (ie il mio itemMovie di prima, che e'
un const char*), basta che tolgo le "" giusto?
Grazie, 


Ah, ovviamente mi sono dimenticata di scrivere tutte le domande.
Se io volessi che succeda qualcosa alla mia applicazione, nel mentre che
wmplayer
(o qualunque altro lettore per esso) sta facendo vedere il mio file, 
come posso fare?
Cio' che voglio fare e' che nella mia applicazione non devo sentire piu'
il suono (perche' se no non si sente un tubo del mio video), posso 
"spegnerlo" subito prima di lanciare shellexecute, e riattivarlo subito
dopo il lancio
oppure, non viene fatto il controllo se wmplayer e' attivo o meno?
Boh, spero di non essere stata troppo contorta...


 ShellExecute(NULL, "open", "c:\fre1.wmv", NULL, NULL, 1);
Con la doppia backslash immagino... "c:\\fre1.wmv".
Che valore ti ritorna la ShellExecute?
Steve.
P.S.: comunque il path di wmplayer.exe lo puoi trovare nel 
registro, quindi se vuoi puoi utilizzare anche la CreateProcess 
che ti può dare maggior controllo sul processo avviato (se serve 
ovviamente). 

 meno?
Puoi farlo benissimo, ma per controllare se il processo lanciato 
(wmplayer.exe in questo caso) è ancora attivo, devi utilizzare 
ShellExecuteEx (non ShellExecute) oppure CreateProcess per 
lanciarlo e poi monitorarlo, come già stavi facendo 
inizialmente, con WaitForSingleObject.
Steve. 

"Steve Aletto" <steve_al...@SPAMhotmail.com> wrote in message
news:lboee.2134$%
I2....@tornado.fastwebnet.it

Allora, ho provato ad usare ShellExecuteEx, ma con scarso successo...
Ecco qua il codice:
SHELLEXECUTEINFO sei = { 0 };
			sei.cbSize = sizeof( sei );
			sei.lpVerb = "open";
			sei.lpFile = "c:\\fre1.wmv";
			sei.nShow = 1;
			sei.fMask = 13;
			bool success = ShellExecuteEx( &sei );
Una volta che sto lanciando questo pezzo di codice mi dice che non
riesce a trovare
il file c:\fre1.wmv (che invece e' li'...).
Se usassi CreateProcess, come faccio a vedere il registro? 
Grazie, 


 bool success = ShellExecuteEx( &sei );
E se metti "play" anzichč "open"?
E poi: utilizza le costanti anzichč 1 e 13 (solo per la forma).
Steve. 

"Steve Aletto" <steve_al...@SPAMhotmail.com> wrote in message
news:ySoee.2275$%
I2....@tornado.fastwebnet.it

Grazie mille. Con "play" effettivamente funziona.
Ho usato i numeri 1 e 13 e non le costanti perche' altrimenti non mi
compila.
(e shellapi.h e' incluso, magari l'ho incluso con i piedi?
#include <shellapi.h>
boh!)
Anche per ShellExecuteEx si usa WaitForSingleObject( pi.hProcess,
INFINITE ); o qualcosa
di simile per aspettare che termini, oppure e' qualcos'altro?
Scusatemi se faccio un sacco di domande sceme, ma e' la prima volta che
uso queste cose!


 di simile per aspettare che termini, oppure e' qualcos'altro?
WaitForSingleObject č una possibilitŕ anche in questo caso.
Steve. 

 
Per fare una cosa del genere devo usare SEE_MASK_NOCLOSEPROCESS, esatto?
visto che: 
Handle to the newly started application. This member is set on return
and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even
if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no
process was launched. For example, if a document to be launched is a URL
and an instance of Microsoft Internet Explorer is already running, it
will display the document. No new process is launched, and hProcess will
be NULL.
Note ShellExecuteEx does not always return an hProcess, even if a
process is launched as the result of the call. For example, an hProcess
does not return when you use SEE_MASK_INVOKEIDLIST to invoke
IContextMenu.
Oppure ho capito male il tutto?
Grazie ancora, 


 SEE_MASK_NOCLOSEPROCESS, esatto?
SEE_MASK_NOCLOSEPROCESS deve esserci, sì, altrimenti non puoi 
recuperare l'handle del processo.
Steve. 

 
Ok, sono alla frutta (e pure alla cozze)
il file e' nella mia subdirectory /movie/ rispetto a dove ho il mio
eseguibile.
ho provato //movie//fre1.wmv
/movie/fre1.wmv
\movie\fre1.wmv
Ovviamente i tipi di errori che mi da sono diversi (e quando mai).
Nel caso: \\movie\\fre1.wmv mi viene detto che non ho un programma
definito
per tale file e quindi si rifiuta di aprirlo.
Negli altri casi, invece, mi dice sommariamente che non riesce a
trovarlo affatto.
Non so proprio quali possono essere gli altri modi per esplicare il
path.
consigli, suggerimenti, altro?( a parte buttare il computer fuori dalla
finestra?)


 finestra?)
Imposta il path completo, non relativo poichè, da quanto ho 
capito, dai per scontato che il path corrente sia quello del tuo 
eseguibile il che potrebbe anche non essere vero.
Steve. 

"Steve Aletto" <steve_al...@SPAMhotmail.com> wrote in message
news:JIqee.2590$%
I2...@tornado.fastwebnet.it

Ah, sono riuscita a sistemare!
Il trucco stava nel togliere i due \\ iniziali.
In realta', sono sicura che i file video siano nel path relativo in
quanto fanno
parte del pacchetto dell'applicazione (per cosi' dire) e quindi, il path
completo non sarebbe stato corretto perche' dipende da dove viene
installata l'applicazione
Con i due \\ stava cercando il path a partire dalla root, mentre senza
invece
direttamente dalla working directory!
Grazie mille per l'aiuto :)


 installata l'applicazione
Completo non significa fisso. Chiaro che devi leggerti a 
run-time dove risiede il tuo eseguibile e costruire di 
conseguenza il path della cartella dei filmati. Questa è la 
soluzione ideale IMHO.
Steve. 

 minore di 32, giusto?
Ritorna un intero a 32 bit. Se è maggiore di 32 hai l'handle 
dell'istanza creata altrimenti un errore.
-- 
Protect your software at all costs; all else is meat.
News 2000 [v 2.06] / StopDialer / PopDuster - 
http://www.socket2000.com
Akapulce portal: 
http://www.akapulce.net

> Se è maggiore di 32 hai l'handle dell'istanza creata
Non credo, il valore di ritorno ti serve solo per verificare 
l'eventuale errore.
Steve. 

 l'eventuale errore.
Stiamo parlando di ShellExecute, non di CreateProcess.
-- 
You're only young once. You're immature forever. 


 Stiamo parlando di ShellExecute, non di CreateProcess.
ha ragione Steve: ShellExecute restituisce 32 o meno se si verifica un
errore, altrimenti un valore maggiore di 32, ma quel valore *non è* un
HINSTANCE (è solo un cast).


 HINSTANCE (è solo un cast).
Uhm... E' vero, è un histance solo per win16...
-- 
The next generation of computers will have a "Warranty Expired" interrupt.
