2009-02-26 9 views
6

Perché questo programma visualizza correttamente una finestra di messaggio, ma non imposta il livello di errore?perché non winmain imposta il errorlevel?

int APIENTRY _tWinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, 
        int  nCmdShow) 
{ 
    MessageBox(NULL, _T("This should return 90 no?"), _T("OK"), MB_OK); 
    return 90; 
} 

Ho compilato il codice sopra al nome un eseguibile chiamato a.exe. L'ho fatto nel prompt dei comandi:

c:\> a.exe 
(message box is displayed, I press ok) 
c:\> echo %ERRORLEVEL% 
    0 

ottengo gli stessi risultati se uso exit(90); destra prima del ritorno. Dice ancora 0.

Ho anche provato ad avviare il programma tramite CreateProcess e ottenere il risultato con GetExitCodeProcess ma restituisce anche 0 per me. Ho fatto un controllo degli errori per assicurarmi che tutto fosse iniziato correttamente.

Originariamente ho visto questo problema in un programma più complesso, quindi ho creato questo semplice programma per verificare il problema. I risultati sono gli stessi, entrambi i programmi che hanno WinMain restituiscono sempre 0.

Ho provato entrambe le opzioni di compilazione x64, x86 e unicode e MBCS. Tutti danno 0 come un livello di errore/codice di stato.

+0

testati con winegcc e restituisce 90 (testato con $?) sul mio sistema. forse qualche problema di shell? –

+0

Sto utilizzando MSVC++ 2005 –

+0

Non penso che sia un problema di shell perché ho anche avviato il processo da un'altra app e ho utilizzato CreateProcess/WaitForSingleObject/GetExitCodeProcess –

risposta

14

Se il programma è un'app di Windows, anziché un'app Console, l'interprete dei comandi non attende il completamento (prima di premere OK, dai un'occhiata alla finestra dei comandi e vedrai che è pronta per il prossimo comando).

In questo caso, la creazione dell'applicazione come app del sottosistema di console risolverebbe il problema. Se è necessario eseguire come applicazione di Windows, si potrebbe tentare di attendere per il completamento del comando e vedere se funziona (non ho provato questo, ma sembra che un buon approccio):

start /wait a.exe 
echo %ERRORLEVEL% 
+0

Grazie. Il problema che avevo con CreateProcess che restituiva 0 era diverso rispetto alla directory di lavoro corrente. –

2

Per %ERRORLEVEL% per funzionare devi avere le estensioni di comando abilitate (che ritengo sia quella predefinita poiché Dio sa quando).

provare a fare:

echo %CMDEXTVERSION% 

per vedere se estensioni sono abilitati. Ottengo l'output '2' quando sono attivi e "%CMDEXTVERSION%" quando sono disattivati.

È inoltre possibile verificare l'errorlevel utilizzando il vecchio stile:

if errorlevel 1 echo errorlevel is 1 or more... 

che dovrebbe funzionare indipendentemente estensioni o se qualcuno ha impostare una variabile di ambiente con il nome "ERRORLEVEL"

+1

Oh ... penso che jdigital abbia colpito il vero problema sulla testa. –

+0

sì grazie per le informazioni utili però –

Problemi correlati