首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FormatMessage返回错误代码8 (ERROR_NOT_ENOUGH_MEMORY)

FormatMessage返回错误代码8 (ERROR_NOT_ENOUGH_MEMORY)
EN

Stack Overflow用户
提问于 2022-10-22 01:32:06
回答 2查看 69关注 0票数 0

我正在尝试将最后一条消息从WinApi打印到控制台。听起来很简单,至少我是这么想的。我做了一个足够简单的函数,但是我得到了一个错误代码8 (ERROR_NOT_ENOUGH_MEMORY)。我不知道这是怎么回事我也没在网上找到任何东西。我要说的是:

代码语言:javascript
运行
复制
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);
}

结果缓冲区在控制台中如下所示:

代码语言:javascript
运行
复制
Error: (null)

我也尝试过FormatMessageW,但这并没有什么不同。( FormatMessage似乎被定义为带有UNICODE的FormatMessageW )

我使用MinGW的GCC与C11,WindowsSDK10.0.22621。

编辑:更新(LPTSTR)&lpMsgBuf。当前代码:

代码语言:javascript
运行
复制
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);
}

和产出:

代码语言:javascript
运行
复制
Error code: 87
Error: 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-22 19:18:04

事实证明,这是一个编译器问题。将MinGW从https://www.mingw-w64.org/转换到https://winlibs.com/的版本使相同的代码运行得很好.

票数 0
EN

Stack Overflow用户

发布于 2022-10-22 07:40:12

我使用MinGW的GCC与C11,WindowsSDK10.0.22621。

那也太没道理了。MinGW附带了自己的Win32 API库。你不应该把它和Windows混为一谈。这可能导致行为不明确。

完全使用MinGW构建代码,远离Windows,或者在Windows中使用MSVC。

我用https://winlibs.com/的MinGW-w64尝试了您的代码,没有问题。下面是我如何将您的代码变成一个独立的程序test.cc

代码语言:javascript
运行
复制
#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;
}

然后我构建了这样的代码:

代码语言:javascript
运行
复制
g++ test.cc

在运行生成的a.exe之后,我得到:

代码语言:javascript
运行
复制
Error code: 126
Error: The specified module could not be found.

因此,看起来您的代码正在工作,您只需要在纯MinGW/MinGW-w64中构建它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74160509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档