2014-01-22 57 views
6

我想在我的程序遇到Win32錯誤時顯示有意義的錯誤消息。我打電話GetLastError,然後FormatMessage。但是一些錯誤消息包含佔位符。例如,ERROR_BAD_EXE_FORMAT有以下文本:如何處理Win32錯誤消息的佔位符?

%1不是有效的Win32應用程序。

推測,%1被替換爲無效的模塊名稱。我如何影響替換?

請注意,我會理想喜歡一個通用的解決方案,因爲我注意到,佔位符有很多錯誤。我可以在文檔中看到以下消息:

  • 錯誤的軟盤在驅動器中。將%2(卷序列號:%3)插入驅動器%1。
  • 操作系統無法運行%1。
  • 此版本的%1與您正在運行的Windows版本不兼容。檢查您計算機的系統信息,然後聯繫軟件發行商。
  • 圖像文件%1已簽名,無法修改。
  • 系統無法在%2的消息文件中找到消息號爲0x%1的消息文本。
  • ...等等。
+1

相關http://blogs.msdn.com/b/oldnewthing/archive/2007/11/28/6564257.aspx –

+0

@AlexK。 *它也讓我感到迷惑,即系統錯誤消息包含%1的插入,您只需要逐個「知道」插入。 -Raymond *不是很令人鼓舞。 –

回答

2

我覺得雷蒙德陳有效地回答了這個問題在他的blog,他寫了一個評論:

它的錯誤我也說系統錯誤消息包含%1插入你剛纔有一個案例「知道」逐案的基礎。

1

ERROR_BAD_EXE_FORMAT包含插入%1。您可以使用​​的最後一個參數進行替換。這個代碼是一個小樣本。

LPWSTR pMessage = L"%1"; 
DWORD_PTR pArgs[] = {(DWORD_PTR)L"My_Test_App.exe" }; 

TCHAR buffer[1024]; 
DWORD dwError = ERROR_BAD_EXE_FORMAT; 
DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY; 
DWORD dwResult = FormatMessage(dwFlags, pMessage, dwError, 0, buffer, 1024, (va_list*)pArgs); 
if (dwResult) 
{ 
    //now, 'buffer' contains below message. 

    // 
    //My_Test_App.exe is not a valid Win32 application. 
    // 
} 

我知道某些系統錯誤代碼有插入。我認爲我們無法爲他們提供相關的論點。所以,如果我是你,我只想使用系統錯誤代碼,而不是​​。或者,僅支持一些頻繁出現的系統錯誤代碼,支持參數列表和​​。

+0

您是否建議我必須針對每種可能的錯誤代碼逐案做到這一點? –

+0

不,絕對不是。不可能。我認爲幾乎Windows應用程序有自己的錯誤消息格式的原因是因爲這種情況。我只想告訴你如何替換佔位符,如果你不知道。 – hyun

+0

@CodeDreamer:使用'FORMAT_MESSAGE_FROM_SYSTEM'時,'lpSource'參數未被使用,可以設置爲NULL而不是指定「%1」。 –