2010-01-21 65 views
1

ShellExecuteEx Win32函數調用有一個標誌SEE_MASK_FLAG_NO_UI在其SHELLEXECUTEINFO結構,它應抑制任何錯誤對話框可能因錯誤而啓動應用程序時顯示在系統啓動.NET應用程序時,顯示錯誤。的ShellExecuteEx與SEE_MASK_FLAG_NO_UI而不.NET

MSDN文檔here是相當明確一下:

SEE_MASK_FLAG_NO_UI 
    0x00000400. Do not display an error message box if an error occurs. 

就我而言,我啓動在安裝.NET沒有在Windows XP系統上的.NET可執行文件。我係統地收到以下消息,在對話窗口由Windows顯示:

Xxx.exe - Application Error 
The application failed to initialize properly (0xc0000135). 
Click on OK to terminate the application. 
[ OK ] 

我不希望用戶必須處理此消息。我寧願從ShellExecuteEx得到一個錯誤代碼,並能夠在我的程序中優雅地處理它。下面是我使用啓動外部可執行代碼片段:

#include <windows.h> 

int wmain(int argc, wchar_t* argv[]) 
{ 
    SHELLEXECUTEINFO info; 
    memset(&info, 0, sizeof(SHELLEXECUTEINFO)); 
    info.cbSize = sizeof(SHELLEXECUTEINFO); 
    info.fMask = SEE_MASK_FLAG_NO_UI; 
    info.lpVerb = L"open"; 
    info.lpFile = L"Xxx.exe"; 
    info.nShow = SW_SHOW; 
    return ShellExecuteEx (&info); 
} 

有抑制錯誤消息,如果.NET不存在系統上的正式方式?或者在執行應用程序之前,我必須自己檢查這個特定的條件(但事先不知道它是.NET應用程序還是本機應用程序)。如果我開始的應用程序缺少一些DLL,例如?

回答

4

標誌只告訴shell將不顯示錯誤消息。它不會影響開始的流程的UI。 .NET .exe真的開始了,因此ShellExecuteEx()完成了它的工作並且沒有發現任何錯誤。它決定後來發生爆炸並讓用戶瞭解它並不是你可以輕易修復的東西。

+0

你是完全正確的。解決此問題的唯一方法是檢測到沒有.NET,並避免完全啓動應用程序。 – 2010-02-02 13:22:57

0

你爲什麼不使用CreateProcess功能

+0

謝謝Remus的建議。我不使用CreateProcess,因爲它也顯示錯誤對話框。我希望SEE_MASK_FLAG_NO_UI選項能以某種方式提供幫助。 – 2010-01-21 13:26:48