2014-04-04 45 views
0

我使用的碼塊和MinGW:克++版本是4.7.1WINAPI的FormatMessage使段錯誤

MSDN的例子(參見最後一個例子中,就在 '要求' 部分):

// Formats a message string using the specified message and variable 
// list of arguments. 
LPWSTR GetFormattedMessage(LPWSTR pMessage, ...) 
{ 
    LPWSTR pBuffer = NULL; 

    va_list args = NULL; 
    va_start(args, pMessage); 

    FormatMessage(FORMAT_MESSAGE_FROM_STRING | 
       FORMAT_MESSAGE_ALLOCATE_BUFFER, 
       pMessage, 
       0, 
       0, 
       (LPWSTR)&pBuffer, 
       0, 
       &args); 

    va_end(args); 

    return pBuffer; 
} 

它出現segfaults在調用FormatMessage。 你有什麼想法爲什麼會發生這種情況,我怎麼能解決這個問題?

這是我怎麼稱呼它:

int x = 3, y = 5; 
GetFormattedMessage(_T("%1 : %2"), x, y); 

我用的FormatMessage因爲我不能在MinGW的使用_stprintf功能,_stprintf是一個定義了標準的swprintf和標準的swprintf itselft沒有作爲一個修復的一些有有定義錯誤%)

+0

鑄造的東西來修復編譯器錯誤是沒有辦法了。你需要傳入一個可以填充的緩衝區。 – chris

+0

鑄造'(LPWSTR)&pBuffer'沒問題。這是微軟要求的。閱讀msdn: lpBuffer參數是指向LPTSTR的指針;您必須將指針轉換爲LPTSTR(例如,(LPTSTR)&lpBuffer)。 – Arks

+0

你確定問題不是由'pMessage'的內容與傳遞的參數不匹配造成的嗎? –

回答

3

FormatMessage要求您傳遞消息字符串中的類型信息。如果你不這樣做,它假定你的參數是C風格的字符串。 MSDN說:

默認情況下,將每個值視爲指向以空字符結尾的字符串的指針。

當你逝去的整數,而不是字符串,您的電話應該是這樣的:

GetFormattedMessage(_T("%1!d! : %2!d!"), x, y); 
+0

謝謝,錯過了那部分。 – Arks