2009-02-26 9 views
6

Dlaczego ten program poprawnie wyświetla okno komunikatu, ale nie ustawia poziomu błędu?dlaczego winmain nie ustawił poziomu błędu?

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; 
} 

Skompilowałem powyższy kod do nazwy pliku wykonywalnego o nazwie a.exe. I zrobił to w wierszu polecenia:

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

uzyskać takie same wyniki, jeśli mogę użyć exit(90); tuż przed powrotem. Nadal jest napisane: 0.

Próbowałem również uruchomić program przez CreateProcess i uzyskać wynik z GetExitCodeProcess, ale również zwraca mi 0. Sprawdziłem, czy wszystko zostało poprawnie uruchomione.

Pierwotnie zobaczyłem ten problem w bardziej złożonym programie, więc zrobiłem ten prosty program, aby zweryfikować problem. Wyniki są takie same, oba programy, które mają WinMain zawsze zwracają 0.

Próbowałem opcji kompilacji x64, x86 oraz unicode i MBCS. Wszystkie dają 0 jako poziom błędu/kod stanu.

+0

przetestowany z winegcc i to „ERRORLEVEL” zwraca 90 (testowane za pomocą $?) w moim systemie. może jakiś problem z powłoką? –

+0

Używam MSVC++ 2005 –

+0

Nie sądzę, że jest to problem powłoki, ponieważ również rozpocząłem proces z innej aplikacji i użyłem CreateProcess/WaitForSingleObject/GetExitCodeProcess –

Odpowiedz

14

Jeśli twój program jest aplikacją Windows, a nie aplikacją Console, interpreter poleceń nie czeka na jej zakończenie (zanim naciśniesz OK, spójrz na okno poleceń, a zobaczysz, że jest gotowy dla następnego polecenia).

Jeśli tak jest, budowanie aplikacji jako aplikacji podsystemu konsoli rozwiązałoby problem. Jeśli trzeba uruchomić jako aplikacji systemu Windows, możesz spróbować czekać na polecenia, aby zakończyć i zobaczyć, czy działa (nie próbowałem tego, ale wydaje się dobrym podejściem):

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

Dzięki działa. Problem, który miałem z funkcją zwracania 0 przez funkcję CreateProcess, był inny, związany z bieżącym katalogiem roboczym. –

2

Dla %ERRORLEVEL% do pracy musisz mieć włączone rozszerzenia poleceń (co moim zdaniem jest domyślne, ponieważ Bóg wie kiedy).

spróbować zrobić:

echo %CMDEXTVERSION% 

Aby sprawdzić, czy extentions są włączone. Otrzymuję "2", gdy są one włączone i "%CMDEXTVERSION%", gdy są wyłączone.

Można również przetestować ERRORLEVEL przy użyciu starego stylu:

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

który powinien działać niezależnie od rozszerzenia lub jeśli ktoś ustawił zmienną Enviroment z nazwą

+1

Oh ... Myślę, że jdigital uderzył w prawdziwy problem na głowie. –

+0

dzięki za przydatne informacje –

Powiązane problemy