我正在嘗試將 WinApi 中的最后一條訊息列印到控制臺。聽起來很簡單,至少我是這么認為的。我做了這個足夠簡單的函式,但我得到一個錯誤代碼 8 (ERROR_NOT_ENOUGH_MEMORY)。我不確定這怎么可能。我也沒有在網上找到任何東西。這是我所擁有的:
static inline void printLastMessage()
{
LPTSTR lpMsgBuf;
if(FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS), NULL,
GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), lpMsgBuf, 0, NULL) == 0)
{
printf("Error Code: %d\n", GetLastError());
}
wprintf(L"Error: %s\n", lpMsgBuf);
LocalFree(lpMsgBuf);
}
生成的緩沖區在控制臺中如下所示:
Error: (null)
我也嘗試過 FormatMessageW,但沒有任何區別。(而且似乎 FormatMessage 被定義為 FormatMessageW 與 UNICODE)
我將 MinGW 的 GCC 與 C11、Windows SDK 10.0.22621 一起使用。
編輯:更新(LPTSTR)&lpMsgBuf。當前代碼:
static inline void printLastMessage()
{
LPTSTR lpMsgBuf;
DWORD err = GetLastError();
printf("Error code: %d\n", err);
if(FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS), NULL,
err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL) == 0)
{
printf("Error Code (FormatMessage): %d\n", GetLastError());
}
wprintf(L"Error: %s\n", lpMsgBuf);
LocalFree(lpMsgBuf);
}
并輸出:
Error code: 87
Error:
uj5u.com熱心網友回復:
我將 MinGW 的 GCC 與 C11、Windows SDK 10.0.22621 一起使用。
那沒有意義。MinGW 帶有它自己的 Win32 API 庫。您不應該將它與 Windows SDK 混合使用。這可能會導致未定義的行為。
純粹使用 MinGW 構建代碼并遠離 Windows SDK,或者將 MSVC 與 Windows SDK 一起使用。
我從https://winlibs.com/使用 MinGW-w64 嘗試了您的代碼,但沒有發現任何問題。這是我如何將您的代碼變成獨立程式的方法test.cc:
#include <windows.h>
#include <stdio.h>
static inline void printLastMessage()
{
LPTSTR lpMsgBuf;
DWORD err = GetLastError();
printf("Error code: %d\n", err);
if(FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS), NULL,
err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL) == 0)
{
printf("Error Code (FormatMessage): %d\n", GetLastError());
}
wprintf(L"Error: %s\n", lpMsgBuf);
LocalFree(lpMsgBuf);
}
int main ()
{
printLastMessage();
return 0;
}
然后我構建了這樣的代碼:
g test.cc
運行結果后,a.exe我得到:
Error code: 126
Error: The specified module could not be found.
所以看起來你的代碼正在運行,你只需要在純 MinGW/MinGW-w64 中構建它。
uj5u.com熱心網友回復:
事實證明,這是一個編譯器問題。從 https://www.mingw-w64.org/ 將 MinGW 更改為https://winlibs.com/上的版本可以使完全相同的代碼運行得很好......
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/522551.html
標籤:C视窗温纳皮
上一篇:WIC中10位影像中的最大浮點值
