FindResourceW()返回错误代码127

FindResourceW() returns error code 127

本文关键字:错误代码 返回 FindResourceW      更新时间:2023-10-16

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

好吧,就像任何有抱负的强迫症程序员一样,我正试图将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之前,它已经起作用了)。基本上,我以前从未见过这种问题,我被难住了

您没有正确使用GetLastErrorFindResourceW

FindResourceW的文档(链接到上面)清楚地指出,FindResourceW返回一个模块句柄(HRSR),如果GetLastError返回NULL,则应检查它(强调部分添加)。

返回值

类型:HRSRC

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

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

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

返回值

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

设置最后一个错误代码的每个函数的文档的"返回值"部分说明了该函数设置最后一次错误代码的条件大多数设置线程最后一个错误代码的函数都会在失败时进行设置。但是,有些函数在成功时还会设置最后一个错误代码。如果函数没有记录为设置最后一个错误代码,则此函数返回的值只是设置的最近一个错误码;一些函数在成功时将最后一个错误代码设置为0,而其他函数则不这样做

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

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

因此,这将更接近于正确的使用(而不是我自己的C++人员):

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