У меня проблема, когда аргументы, переданные в 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 Кбайт».
Я легко могу обойти это, сделав еще большую проверку ошибок и наложив некоторые вменяемые ограничения на размер аргументов, которые я передаю в эту функцию, но для будущей справки моих и других было бы здорово узнать, что на самом деле пределы.