Вот довольно актуальный фрагмент кода, демонстрирующий, как загрузить сообщение об ошибке для кода ошибки Windows API. < /li>
Вот много Старый фрагмент кода с использованием того же синтаксиса, чтобы сделать то же самое. или LPSTR и LPCSTR Обмен тем же представлением символов. br />
Примечание особенно: < /li>
< /ul>
Указатель на буфер , который получает нулевую строку, которая указывает форматированное сообщение. Если dwflags включает в себя format_message_allocate_buffer , функция выделяет буфер с использованием функции Localalloc , и помещает указатель на буфер по адресу, указанному в lpbuffer . class = "lang-cpp prettyprint-override">
unsigned long FormatMessageW(
unsigned long dwFlags,
const void * lpSource,
unsigned long dwMessageId,
unsigned long dwLanguageId,
wchar_t * lpBuffer,
unsigned long nSize,
char ** Arguments
)
Как вы можете видеть, , что мы передаем , действительно «указатель на буфер»: void ** . Но то, что мы его подготовили в -просто буфер: wchar_t *.
И мы должны, как Formatmessage /-a /-W не принимает a ** (или *& ). Собираясь по своей подписи, он должен выделить буфер прямо at & lpmsgbuf , напишите второй wchar at (& lpmsgbuf) + sizeof (wchar_t) и в основном разбил наш стек. < Br /> (это не то, что происходит, конечно: оба связанных фрагментов кода работают как предполагалось, если не так, как ожидалось). < /p>
Мне кажется, что я должен обмануть Компилятор, позволяющий мне передать неправильный тип в функцию. > (например, я бы ожидал, что код - после расширения макроса - чтобы выглядеть так: < /p>
Но это, конечно, не компилируется, как & lpmsgbuf wchar_t ** , а не wchar_t *.)
x /y Ответ: Оказалось, что современная < /em>, UTF-8 версия этого проклятого API вокруг?
Этот материал прямо из Microsoft «Let's Code максимально инопланетяне». К сожалению, getlasterror и оттуда Formatmessage , кажется, является единственным способом обработки ошибок для вызовов Windows API, таких как GetProcessaffinityMask, для которого в настоящее время не существует стандартного эквивалента C ++. Я бы предпочел не трогать это с помощью общеизвестного десятифутного шеста.
[list] [*] Вот довольно актуальный фрагмент кода, демонстрирующий, как загрузить сообщение об ошибке для кода ошибки Windows API. < /li> Вот много Старый фрагмент кода с использованием того же синтаксиса, чтобы сделать то же самое. или LPSTR и LPCSTR Обмен тем же представлением символов. br /> Примечание особенно: < /li> < /ul>
[code][out] lpBuffer[/code] [b] Указатель на буфер [/b], который получает нулевую строку, которая указывает форматированное сообщение. Если dwflags включает в себя format_message_allocate_buffer , функция выделяет буфер с использованием функции Localalloc , [b] и помещает указатель на буфер по адресу, указанному в [/b] lpbuffer . class = "lang-cpp prettyprint-override">[code]void ErrorExit() { LPVOID lpMsgBuf; DWORD dw = GetLastError();
LocalFree(lpMsgBuf); ExitProcess(dw); } < /code> На моей настройке - X64, Visual Studio 2022 (V143), Windows 10 SDK - эти типы оцениваются следующим образом: < /p>
< li>LPVOID[/code]: void * [*] formatmessage: [/list] [code]unsigned long FormatMessageW( unsigned long dwFlags, const void * lpSource, unsigned long dwMessageId, unsigned long dwLanguageId, wchar_t * lpBuffer, unsigned long nSize, char ** Arguments ) [/code] Как вы можете видеть, , что мы передаем , действительно «указатель на буфер»: void ** . Но то, что мы его подготовили в -просто буфер: wchar_t *. И мы должны, как Formatmessage /-a /-W не принимает a ** (или *& ). Собираясь по своей подписи, он должен выделить буфер прямо at & lpmsgbuf , напишите второй wchar at (& lpmsgbuf) + sizeof (wchar_t) и в основном разбил наш стек. < Br /> (это не то, что происходит, конечно: оба связанных фрагментов кода работают как предполагалось, если не так, как ожидалось). < /p> Мне кажется, что я должен обмануть Компилятор, позволяющий мне передать неправильный тип в функцию. > (например, я бы ожидал, что код - после расширения макроса - чтобы выглядеть так: < /p> [code]wchar_t * lpMsgBuf; [...] MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &lpMsgBuf, 0, NULL) == 0) { [...] [/code] Но это, конечно, не компилируется, как & lpmsgbuf wchar_t ** , а не wchar_t *.) x /y Ответ: Оказалось, что современная < /em>, UTF-8 версия этого проклятого API вокруг?
Этот материал прямо из Microsoft «Let's Code максимально инопланетяне». К сожалению, getlasterror и оттуда Formatmessage , кажется, является единственным способом обработки ошибок для вызовов Windows API, таких как GetProcessaffinityMask, для которого в настоящее время не существует стандартного эквивалента C ++. Я бы предпочел не трогать это с помощью общеизвестного десятифутного шеста.