FindResourceW()返回错误代码127

时间:2013-07-31 00:21:08

标签: 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内容的向量。

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

我有其他嵌入的文件在我的可执行文件,包括MP3和dll文件,都取得了同样的方式,他们做工精细(和,同样,这PNG甚至正常工作我自己的电脑上),所以我知道这是不是一个问题嵌入物;我想我差不多了。

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

1 个答案:

答案 0 :(得分:1)

您未正确使用GetLastErrorFindResourceW

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

  

返回值

     

类型:HRSRC

     

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

     

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

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

  

返回值

     

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

     

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

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

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));
}