Есть ли четко определенные ограничения по размеру в FormatMessage? - PullRequest
0 голосов
/ 26 ноября 2009

У меня проблема, когда аргументы, переданные в 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 байт, проблема не возникает, но неясно, связано ли ограничение с размером передаваемых аргументов или итоговым общим размером сгенерированной строки. Страница MSDN на FormatMessage говорит о параметре lpBuffer: «Этот буфер не может быть больше 64 Кбайт».

Я легко могу обойти это, сделав еще большую проверку ошибок и наложив некоторые вменяемые ограничения на размер аргументов, которые я передаю в эту функцию, но для будущей справки моих и других было бы здорово узнать, что на самом деле пределы.

1 Ответ

1 голос
/ 26 ноября 2009

Вы звоните FormatMessageA или FormateMessageW? Если вы наберете FormatMessageA, ваше сообщение ASCII 32K будет преобразовано в сообщение Unicode 64K. В настоящее время Windows является внутренним Unicode, а ряд функций «A» - это просто оболочки для функций «W».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...