2009-11-25 16 views
0

當傳遞給FormatMessage的參數太長時,我遇到問題。FormatMessage中是否有明確的大小限制?

void testMessage(UINT id, ...) 
{ 
    va_list argList; 
    va_start(argList, id); 

    LPTSTR buff = NULL; 

    const char* str = "The following value is invalid: %1"; 

    DWORD success = FormatMessage(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER, 
      str, 0, 0, (LPSTR) &buff, 0, &argList); 

    if(0 == success) 
    { 
     DWORD err = GetLastError(); 

     //... 
    } 

    va_end(argList); 

    //... 
} 

int main(int argc, char** argv) 
{ 
    const char* arg = NULL; 

    // ... 
    // Initialize arg to some big string about 33,000 bytes long. 
    // ... 

    test(0, arg); 
} 

我得到的錯誤是ERROR_MORE_DATA(234)。當我將arg的大小減小到大約32,000字節時,問題不會發生,但是不清楚限制是與傳入的參數的大小還是生成的字符串的總大小有關。 FormatMessage上的MSDN page表示關於lpBuffer參數,「此緩衝區不能大於64K字節」。

我可以通過做更多的錯誤檢查並對我傳遞給這個函數的參數的大小加上一些理智的限制來輕鬆解決這個問題,但是對於我和其他人的未來參考,知道什麼是真正的限制是。

回答

1

你打電話給FormatMessageAFormateMessageW?如果您撥打FormatMessageA,您的32K ASCII消息將被編組爲64K Unicode消息。今天的Windows是內部Unicode的,「A」系列函數只是圍繞「W」函數的包裝。

+0

啊,我想我打電話給FormatMessageA,因爲我沒有定義UNICODE宏。這聽起來像是一個解釋。謝謝! – Owen 2009-11-26 17:51:31

相關問題