Newsgroup: it.comp.programmare.win32
Titolo: [help] system e maschere nere da evitare...

Ciao a tutti,
vi scrivo per chiedere un aiuto (spero) veloce: usando VC++ 6.0, ho 
creato una semplice applicazione windows.
Tutto funziona, ma quando uso il comando system() per lanciare un 
eseguibile esterno mi compare una fastidiosissima maschera nera.
Il codice incriminato è questo:
////////////////////////////////////
void myfunc(void)
...
char * comando;
comando = malloc( ... );
strcpy( comando, "mioexe.exe " );
strcat( comando, opzioni_per_mioexe );
strcat( comando, " >>out_std.log 2>out_err.log" );
system( comando );
...
////////////////////////////////////
come posso fare per NON far attivare le maschere nere?
Grazie mille per ogni risposta!
-- 
andrea

 eseguibile esterno mi compare una fastidiosissima maschera nera.
"Maschera nera"? Per caso parli della finestra con la shell dei comandi?

Massimo Soricetti ha scritto:

si: proprio quella.
Scusa l'imprecisione ma a volte, a forza di parlare con utenti non 
proprio professionali, dimentico anch'io i termini giusti...

 si: proprio quella.
prova con ShellExecute
su msdn la documentazione
ciao

Peppino Eucrepitio ha scritto:

allora... cercando ShellExecute ho trovati vari doc. in cui si 
consigliava l'uso di CreateProcess(), ma non riesco ad usarla:
Io ho scritto una piccolissima applicazione che usa LAME per trasformare 
un mp3 in formato wav.
Se chiamo LAME.exe con la funzione system funziona tutto, ma se provo a 
usare CreatePRocess (per evitare la fastidiosa maschera della shell dos) 
non funziona: io provo ad eseguire esatamente la stessa riga di comando, 
ma non riesco a chiamare LAME.exe . Non credo sia un problema di path, 
visto che system() funziona, i file di errore venono creati (vuoti) 
nella stessa cartella di LAME.exe e che mettere lame.exe con la dll 
sotto \windows\ non sortisce alcun effetto...
Ho provato a controllare come è formattata la stringa del comando, ed ho 
scoperto che è della forma
LAME.exe --mp3input --decode -k "D:\\Musica\\file.mp3" D:\_temp.wav
... qualche suggerimento?
grazie!
Il codice funzionante è:
	strcpy( comando_LAME, "LAME.exe --mp3input --decode -k \"" );
	strcat( comando_LAME, nomefile_in );
	strcat( comando_LAME, "\" " );
	strcat( comando_LAME, NOME_FILE_WAV_TEMP );
	strcat( comando_LAME, " >>LAME_std.log 2>LAME_err.log" );
#ifdef DEBUG
	strcpy( debugging, "echo " );
	strcat( debugging, comando_LAME );
	strcat( debugging, ">>C:\\test.txt" );
	system( debugging );
#endif
	if( system( comando_LAME ) == -1 ) {
		blablabla();
	}
mentre quello non funzionante è:
#include <windows.h>
	STARTUPINFO		si;
	PROCESS_INFORMATION	pi;
	strcpy( nomefile_wav, NOME_FILE_WAV_TEMP );
	strcpy( comando_LAME, "LAME.exe --mp3input --decode -k \"" );
	strcat( comando_LAME, nomefile_in );
	strcat( comando_LAME, "\" " );
	strcat( comando_LAME, NOME_FILE_WAV_TEMP );
	strcat( comando_LAME, " >>LAME_std.log 2>LAME_err.log" );
#ifdef DEBUG
	strcpy( debugging, "echo " );
	strcat( debugging, comando_LAME );
	strcat( debugging, ">>C:\\test.txt" );
	system( debugging );
#endif
	ZeroMemory( &si, sizeof(si) );
	si.cb = sizeof(si);
	ZeroMemory( &pi, sizeof(pi) );
	ret = CreateProcess( NULL, comando_LAME, NULL, NULL, FALSE, 
CREATE_NO_WINDOW, NULL, NULL, &si, &pi );
	if (ret = 0) {
		...
		return ;
	}
	while( ret != WAIT_OBJECT_0 ) {
		ret = WaitForSingleObject( pi.hProcess, 1000000 );
		if (ret = WAIT_FAILED) {
			... ...
			return ;
		}
	}

non funziona
Usi male CreateProcess(), devi separare il nome dell'applicazione, dai
suoi parametri:
...
LPCTSTR lpApplicationName, // pointer to name of executable module 
LPTSTR lpCommandLine, // pointer to command line string

 LPTSTR lpCommandLine, // pointer to command line string
non necessariamente: il nome e percorso dell'applicazione può stare anche
in lpCommandLine (possibilmente tra apici doppi), nel qual caso
lpApplicationName è NULL.
oppure si può fare al contrario (lpCommandLine nullo e nome file modulo in
lpApplicationName) quando non si devono specificare parametri.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 lpApplicationName è NULL.
ah: in tal caso però attenzione al fatto che lpCommandLine non è CONST -
tutta la stringa va ricopiata in un buffer modificabile.
