0

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

好吧,就像任何有抱负的强迫症程序员一样,我正在尝试将 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 内容的向量。

这个库被编译成我自己的代码使用的静态链接库。因此,我的代码执行了资源的实际嵌入。现在,问题是,这有效,但仅在少数几台计算机上有效。我能够运行它,就像我的一个朋友一样。在其他任何人的计算机上,GetLastError()返回 127,结果程序就崩溃了。根据msdn,错误 127 是The specified procedure could not be found.……无论如何。

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

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

4

1 回答 1

1

您没有正确使用GetLastErroror FindResourceW

(上面链接)的文档FindResourceW清楚地说明FindResourceW返回模块句柄(HRSR),并且您应该检查GetLastError 它是否返回 NULL(添加了重点)。

返回值

类型: HRSRC

如果函数成功,则返回值是指定资源信息块的句柄。要获取资源句柄,请将此句柄传递给 LoadResource 函数。

如果函数失败,则返回值为 NULL。要获取扩展错误信息,请调用 GetLastError。

从文档GetLastError(再次,上面链接,再次强调我的

返回值

返回值是调用线程的最后一个错误代码。

设置最后一个错误代码的每个函数的文档的返回值部分记录了函数设置最后一个错误代码的条件。大多数设置线程最后错误代码的函数在失败时都会设置它。但是,某些函数在成功时也会设置最后一个错误代码。如果该函数没有记录设置最后一个错误代码,则该函数返回的值只是最近设置的最后一个错误代码;一些函数在成功时将最后一个错误代码设置为 0,而其他函数则没有。

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

FindResourceWSetLastError仅在失败并返回时才被明确记录NULL。您假设的错误值FindResourceW来自代码中设置错误值的其他位置(您的代码显然没有读取)。

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

HRSRC   hRsrc = FindResourceW(NULL, recName, recType);
if (!hRsrc)
{
    char b[100];
    leave("Couldn't find resource", itoa(GetLastError(), b, 10));
}
于 2013-07-31T00:53:48.833 回答