Newsgroup: it.comp.lang.c++
Titolo: URGENTISSIMO! Ancora problemi con lo SPAWNL!

Scusate la pedanteria e l'insistenza, ma sono disperato, non riesco ad
ottenere l'effetto voluto con lo SPAWNL, e non so piu' come fare, i
manuali non mi sono di aiuto in alcun modo. Quindi ripeto la
precedente mail sperando che qualche anima buona si impietosisca e mi
aiuti.
Ciao a tutti,
	chiamando 
		_spawnl(cost, prog_name, prog_name,NULL)
	quale deve essere la costante cost affinche' possa ottenere 
             l'effetto di mandare in esecuzione il prg chiamato e 
             mettere contemporaneamente in attesa quello chiamante, 
             riattivando quest'ultimo solo quando il prg
	chiamato ha terminato l'esecuzione?
	Ho provato con _P_NOWAIT, ma l'effetto non e' esattamente 
             quello da me voluto, infatti il prg chiamante continua 
             l'esecuzione e manda contemporaneamente in esecuzione 
             quello chiamato, _P_WAIT, ovviamente,
             genera l'effetto opposto. Non vedo altre costanti da 
             poter usare.
	Anche soluzioni alternative allo SPAWNL sono bene accette,
	purche' funzionanti.
	Vi prego. Datemi una mano. Sono incasinatissimo!
	Bye
	Enrico

aspettando che l'altro termini.
       Ma il CreateProcess non restituisce l'handle del processo, in
      quanto e' una funzione che ritorna un BOOL. Quindi l'handle poi
      dove lo prendo?
      Bye
      Enrico

aspettando che l'altro termini.
	A me sembra che le istruzioni che pongo di seguito dovrebbero 
	ottenere l'effetto di far attendere il processo chiamante fino
	al termine del processo chiamato. E invece non funzionano.
	Si blocca tutto.
	int ProcID = spawnl(_P_NOWAIT,"C:\\Scantool\\Scantool.exe", 
"C:\\Scantool\\Scantool.exe", 
NULL);
	cwait(&termstat, ProcID, NULL);
	Bye
	Enrico

      dove lo prendo?
RTFM !!! :) 
BOOL CreateProcess( 
    LPCTSTR lpApplicationName, 
    LPTSTR lpCommandLine, 
    LPSECURITY_ATTRIBUTES lpProcessAttributes, 
    LPSECURITY_ATTRIBUTES lpThreadAttributes, 
    BOOL bInheritHandles, 
    DWORD dwCreationFlags, 
    LPVOID lpEnvironment, 
    LPCTSTR lpCurrentDirectory, 
    LPSTARTUPINFO lpStartupInfo, 
    LPPROCESS_INFORMATION lpProcessInformation  
   ); 
LPPROCESS_INFORMATION lpProcessInformation
Points to a PROCESS_INFORMATION structure that receives identification
information about the new process. 
typedef struct _PROCESS_INFORMATION { // pi 
    HANDLE hProcess; 
    HANDLE hThread; 
    DWORD dwProcessId; 
    DWORD dwThreadId; 
} PROCESS_INFORMATION; 
 
Members
hProcess 
Returns a handle to the newly created process. The handle is used to
specify the process in all functions that perform operations on the
process object. 
hThread 
Returns a handle to the primary thread of the newly created process.
The handle is used to specify the thread in all functions that perform
operations on the thread object. 
Come vedi nella struttura PROCESS_INFORMATION c'e' tutto quello che
serve. Non dimenticare la CloseHandle() dopo aver terminato di
utilizzare gli handles di processo e thread.
Ciao
Gianpaolo Bottin
- Live Long and Prosper -

 
BOOL CreateProcess( 
	LPCTSTR lpApplicationName,				// nome dell'eseguibile
	LPTSTR lpCommandLine, 					// linea comando completa 
	LPSECURITY_ATTRIBUTES lpProcessAttributes,	// attributi di sicurezza del
processo
	LPSECURITY_ATTRIBUTES lpThreadAttributes, 	// attributi di sicurezza del
thread
	BOOL bInheritHandles, 					// ereditarieta' dell'handle del processo 
	DWORD dwCreationFlags, 					// flag di creazione 
	LPVOID lpEnvironment, 					// blocco di ambiente 
	LPCTSTR lpCurrentDirectory, 				// nome della directory corrente 
	LPSTARTUPINFO lpStartupInfo, 				// punta a STARTUPINFO 
	LPPROCESS_INFORMATION lpProcessInformation); 	// punta a
PROCESS_INFORMATION 
per maggiori dettagli sui parametri vedi il manuale on line.
io l'ho usata in questa chiamata lascindo a NULL odefault i parametri meno
indispensabili:
PROCESS_INFORMATION processInfo;
memset(&processInfo, 0,sizeof(PROCESS_INFORMATION));
STARTUPINFO	startupInfo;
memset(&startupInfo, 0,sizeof(STARTUPINFO));
startupInfo.cb = sizeof(STARTUPINFO);
BOOL ::CreateProcess( 
		NULL,			// eventuale path (usa command line)
		(LPTSTR) "\\\\MyServer\\MyDisc\\MyDir\\MyProgram MyArg1 MyArg2",	//
command line string completa
		NULL,			// default process security attributes 
		NULL,			// default thread security attributes 
		TRUE, 		// handle inheritance flag 
		CREATE_DEFAULT_ERROR_MODE,	// creation flags 
		NULL, 		// default environment 
		NULL, 		// default current directory 
		&startupInfo,	// STARTUPINFO 
		&processInfo);	// PROCESS_INFORMATION 
ovviamente rilascia TRUE se va a buon fine FALSE in altri casi.
In processInfo ti ritrovi l'handle del processo creato, se ti serve in
altre parti del programma
per verificare per esempio se e' ancora attivo o meno, ricordati in ogni
caso che PRIMA di terminare
il programma chiamante DEVE chiudere l'handle del programma chiamato (o
meglio la sua copia interna).
Spero di esserti stato d'aiuto.
-- 
================
       _/
    _/_/_/
     _/
    _/  _/
    _/_/
tec...@login.it
================