2009-02-26 35 views
6

Tại sao chương trình này hiển thị chính xác hộp thư nhưng không đặt mức lỗi?lý do tại sao không winmain đặt 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; 
} 

Tôi đã biên dịch mã ở trên thành tên thực thi có tên là a.exe. Tôi đã làm điều này trong dấu nhắc lệnh:

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

tôi nhận được kết quả tương tự nếu tôi sử dụng exit(90); ngay trước sự trở lại. Nó vẫn nói 0.

Tôi cũng đã cố gắng bắt đầu chương trình qua CreateProcess và nhận kết quả với GetExitCodeProcess nhưng cũng trả về 0 cho tôi. Tôi đã kiểm tra lỗi để đảm bảo rằng tất cả đã được bắt đầu chính xác.

Ban đầu tôi thấy vấn đề này trong một chương trình phức tạp hơn vì vậy tôi đã thực hiện chương trình đơn giản này để xác minh sự cố. Kết quả giống nhau, cả hai chương trình có WinMain luôn trả về 0.

Tôi đã thử cả hai tùy chọn biên dịch x64, x86 và unicode và MBCS. Tất cả cung cấp cho 0 làm cấp độ lỗi/mã trạng thái.

+0

thử nghiệm với winegcc và nó trả về 90 (thử nghiệm với $?) trên hệ thống của tôi. có lẽ một số vấn đề vỏ? –

+0

Tôi đang sử dụng MSVC++ 2005 –

+0

Tôi không nghĩ đó là vấn đề về trình bao vì tôi cũng đã bắt đầu quá trình từ một ứng dụng khác và sử dụng CreateProcess/WaitForSingleObject/GetExitCodeProcess –

Trả lời

14

Nếu chương trình của bạn là ứng dụng Windows, chứ không phải ứng dụng Console, trình thông dịch lệnh sẽ không đợi nó hoàn thành (trước khi bạn nhấn OK, hãy xem cửa sổ lệnh và bạn sẽ thấy nó đã sẵn sàng cho lệnh tiếp theo).

Nếu đúng như vậy, việc xây dựng ứng dụng của bạn dưới dạng ứng dụng hệ thống con Console sẽ giải quyết được sự cố. Nếu bạn cần phải chạy như một ứng dụng Windows, bạn có thể thử để chờ lệnh để hoàn thành và xem nếu mà làm việc (tôi đã không cố gắng này, nhưng nó có vẻ như một cách tiếp cận tốt):

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

Cảm ơn các công trình. Vấn đề tôi gặp phải với CreateProcess trở về 0 là một vấn đề khác liên quan đến thư mục làm việc hiện tại. –

2

Đối %ERRORLEVEL% để làm việc, bạn phải bật các tiện ích mở rộng lệnh (mà tôi nghĩ là mặc định vì Chúa biết khi nào).

Hãy thử thực hiện:

echo %CMDEXTVERSION% 

Để xem nếu extentions được kích hoạt. Tôi nhận được kết quả '2' khi chúng bật và "%CMDEXTVERSION%" khi chúng tắt.

Bạn cũng có thể kiểm tra errorlevel sử dụng phong cách cũ:

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

Điều đó sẽ làm việc bất kể các phần mở rộng hoặc nếu ai đó đã thiết lập một biến môi trường với tên gọi "ERRORLEVEL"

+1

Oh ... Tôi nghĩ rằng jdigital đã nhấn vấn đề thực sự trên đầu. –

+0

yup cảm ơn thông tin hữu ích –

Các vấn đề liên quan