c++ - FindResourceW() 返回错误代码 127

标签 c++ winapi dll

好吧...所以我正在使用 Visual Studio 2010 制作 win32 游戏...很简单。我正在使用处理图形的第三方库。它读入一个 png 文件,创建窗口,显示所有内容,并且通常会做一些没人愿意自己处理的方便的低级事情。

嗯,就像任何有抱负的 OCD 程序员一样,我试图将 png 嵌入到可执行文件中,因为我不喜欢它只是卡在目录中供所有人查看。所以,我得到了源代码,并开始修改它,而不是从文件加载 png,而是从资源加载它。我添加了以下代码:

    HRSRC   hRsrc = FindResourceW(NULL, recName, recType);
    if (GetLastError() != 0)
    {
        char b[100];
        leave("Couldn't find resource", itoa(GetLastError(), b, 10));
    }
    HGLOBAL hGlob1 = LoadResource(NULL, hRsrc);
    int size = SizeofResource(NULL, hRsrc);
    HGLOBAL hGlobal = GlobalAlloc(GMEM_FIXED, size);
    LPVOID  resPtr = LockResource(hGlob1);
    LPSTREAM pStream;
    memcpy(hGlobal, resPtr, size);
    FreeResource(hGlob1);
    CreateStreamOnHGlobal(hGlobal, true, &pStream);
    buffer.resize((size_t)size);
    pStream->Read(&buffer[0], size, NULL);
    return;

recName 是资源的名称。 recType 是资源的类型(它们都作为参数传入)。 leave 是显示弹出消息的自定义函数。 buffer 是读取 png 内容的 vector 。

这个库被编译成我自己的代码使用的静态链接库。因此,我的代码实际嵌入了资源。现在,问题是,这有效,但只适用于少数几台计算机。我能够运行它,就像我的一个 friend 一样。在任何其他人的计算机上,GetLastError() 返回 127,结果,程序崩溃了。根据msdn ,错误 127 是 找不到指定的过程。 ...不管那是什么意思。

我的可执行文件中还有其他嵌入文件,包括 mp3 和 dll,它们都是以相同的方式制作的,并且它们工作正常(而且,这个 png 甚至在我自己的计算机上也工作正常),所以我知道这不是问题嵌入东西;我想我已经把它记下来了。

那么……错误代码 127 试图告诉我什么?我用户的计算机是否不知道如何运行 FindResourceW 函数?如果是这样,那绝对没有意义,因为我的代码在其他地方使用了该函数,用于加载 mp3,并且效果也很好(事实上,在我开始尝试嵌入 png 之前,它已经起作用了)。基本上,我以前从未见过这种问题,我被难住了。 :|

最佳答案

您没有正确使用 GetLastErrorFindResourceW .

FindResourceW 的文档(上面链接)明确指出 FindResourceW 返回模块句柄 (HRSR),您应该检查 GetLastError 如果它返回 NULL(强调已添加)。

Return value

Type: HRSRC

If the function succeeds, the return value is a handle to the specified resource's information block. To obtain a handle to the resource, pass this handle to the LoadResource function.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.

来自关于 GetLastError 的文档(同样,在上面链接,并且再次强调我的:

Return value

The return value is the calling thread's last-error code.

The Return Value section of the documentation for each function that sets the last-error code notes the conditions under which the function sets the last-error code. Most functions that set the thread's last-error code set it when they fail. However, some functions also set the last-error code when they succeed. If the function is not documented to set the last-error code, the value returned by this function is simply the most recent last-error code to have been set; some functions set the last-error code to 0 on success and others do not.

这表示除非函数被记录为在成功时设置最后一个错误代码,否则错误代码应该只用于指示状态如果函数失败。您的代码假设如果 GetLastError 不是 0,则 FindResourceW 失败,并且该假设是错误的。 :-) 由于假设失败,您的代码(错误地)进入 if block 并在不应该调用时调用 leave ,这在逻辑上意味着代码之后if block 结束永远不会执行。

FindResourceW 清楚地记录到只有 SetLastError 如果它失败并返回 NULL。您假设的错误值来自 FindResourceW 来自代码中设置错误值的其他地方(您的代码显然没有读取)。

所以这会更接近于正确使用(我自己不是 C++ 人):

HRSRC   hRsrc = FindResourceW(NULL, recName, recType);
if (!hRsrc)
{
    char b[100];
    leave("Couldn't find resource", itoa(GetLastError(), b, 10));
}

关于c++ - FindResourceW() 返回错误代码 127,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17959624/

相关文章:

c++ - 删除 vector 大小为 0 的结构 vector 的所有元素

c - 从 32 位进程获取 64 位进程的命令行字符串

c - 为什么我的 .so 有 undefined symbol

c# - 如何在C#中用指针调用C语言编码的dll

C++ CMake 找不到 Boost 1.63(使用 CLion IDE)

c++ - 在以下 C++ 代码中,运算符重载决策如何基于返回类型工作

c++ - 渲染缓冲区的 OpenCL/OpenGL 互操作尺寸与工作组大小的关系

winapi - 从点开始的真实 hwnd

c++ - 没有窗口的后台进程

c++ - 从导出的 dll 函数访问 dll 中的全局数据