2009-11-25 2 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 바이트로 줄이면 문제가 발생하지 않지만 제한 사항이 전달 된 인수의 크기 또는 생성 된 문자열의 결과 총 크기와 관련이 있는지 여부가 불분명합니다. FormatMessageMSDN pagelpBuffer 매개 변수에 대해 "이 버퍼는 64KB보다 클 수 없습니다."라고 말합니다.

좀 더 오류 검사를하고이 함수에 전달하는 인수의 크기에 몇 가지 정당한 제한을두면이 문제를 쉽게 해결할 수 있지만 내 및 다른 사람들의 향후 참조를 위해 진짜 한계는 있습니다.

답변

1

FormatMessageA 또는 FormateMessageW으로 전화 하시겠습니까? FormatMessageA을 호출하면 32K ASCII 메시지가 64K 유니 코드 메시지로 정렬됩니다. Windows는 현재 내부적으로 유니 코드이며 "A"시리즈 함수는 "W"함수를 감싸는 래퍼 일뿐입니다.

+0

UNICODE 매크로가 정의되어 있지 않기 때문에 아, FormMessageA를 호출하는 것 같습니다. 그래서 그것은 설명처럼 들립니다. 감사! – Owen

관련 문제