2009-02-26 4 views
6

이 프로그램이 메시지 상자를 올바르게 표시하지만 오류 수준을 설정하지 않는 이유는 무엇입니까?왜 winmain이 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; 
} 

위의 코드를 a.exe라는 실행 파일 이름으로 컴파일했습니다. 의 I는 명령 프롬프트에서 이런 짓을 : 바로 반환하기 전에 exit(90);를 사용하는 경우

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

나는 같은 결과를 얻을 수 있습니다. 여전히 0라고합니다.

CreateProcess을 통해 프로그램을 시작하고 GetExitCodeProcess으로 결과를 얻으려고 시도했지만 나에게 0을 반환합니다. 모든 오류가 올바르게 시작되었는지 확인하기 위해 오류 검사를 수행했습니다.

나는 더 복잡한 프로그램에서이 문제를 처음 보았으므로이 간단한 프로그램을 사용하여 문제를 확인했습니다. 결과는 같습니다. WinMain 인 프로그램은 항상 0을 반환합니다.

x64, x86 및 유니 코드 및 MBCS 컴파일 옵션 모두를 시도했습니다. 모두는 0에 오류 수준/상태 코드를 제공합니다.

+0

이 winegcc과 테스트를 내 시스템에서 90을 반환합니다 ($?로 테스트 됨). 쉘 문제일까요? –

+0

MSVC++ 2005를 사용하고 있습니다. –

+0

다른 응용 프로그램에서 프로세스를 시작하고 CreateProcess/WaitForSingleObject/GetExitCodeProcess를 사용했기 때문에 쉘 문제가 아닌 것 같습니다. –

답변

14

프로그램이 콘솔 앱이 아닌 Windows 앱인 경우 명령 해석기가 완료 될 때까지 기다리지 않습니다. 확인을 누르기 전에 명령 창을보고 준비가 완료된 것을 볼 수 있습니다 다음 명령).

응용 프로그램을 콘솔 서브 시스템 응용 프로그램으로 빌드하면 문제가 해결됩니다. 당신은 윈도우 응용 프로그램으로 실행해야하는 경우 (I이 시도하지 않은하지만 그것은 좋은 방법처럼 보인다)을 완료하고 작동하는지 확인하기 위해 명령을 기다리는 시도 할 수 있습니다 : %ERRORLEVEL%를 들어

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

감사합니다. 0을 반환하는 CreateProcess와 관련된 문제는 현재 작업 디렉토리와 관련된 다른 문제였습니다. –

2

명령 확장 기능을 사용하도록 설정해야합니다 (신이 언제 알 수 있듯이 기본 설정이라고 생각합니다). 일을

시도 : 확장명을 사용하는 경우

echo %CMDEXTVERSION% 

를 볼 수 있습니다. 켜져있을 때 '2'이 출력되고 꺼져있을 때는 "%CMDEXTVERSION%"이 출력됩니다.

또한 기존의 스타일을 사용하여 오류 수준을 테스트 할 수

누군가가 이름의 환경 변수를 설정 한 경우 확장에 관계없이 일을하거나해야
if errorlevel 1 echo errorlevel is 1 or more... 

"ERRORLEVEL는"

+1

아 ... 제 생각에는 jdigital이 진짜 문제를 안고 있다고 생각합니다. –

+0

유용한 정보를 주셔서 감사합니다. –

관련 문제