C++ FindResourceW()返回错误代码127
好的。。。所以我用Visual Studio 2010制作了一个win32游戏。。。什么的。我正在使用第三方库来处理图形。它读入一个png文件,创建窗口,显示所有内容,并且通常做一些没有人愿意自己处理的方便的低级事情 嗯,就像任何有抱负的OCD程序员一样,我正试图将png嵌入可执行文件中,因为我不喜欢它只是挂在目录中让每个人都看到。因此,我得到了源代码,并开始修改它,而不是从文件加载png,而是从资源加载。我添加了以下代码:C++ FindResourceW()返回错误代码127,c++,winapi,dll,C++,Winapi,Dll,好的。。。所以我用Visual Studio 2010制作了一个win32游戏。。。什么的。我正在使用第三方库来处理图形。它读入一个png文件,创建窗口,显示所有内容,并且通常做一些没有人愿意自己处理的方便的低级事情 嗯,就像任何有抱负的OCD程序员一样,我正试图将png嵌入可执行文件中,因为我不喜欢它只是挂在目录中让每个人都看到。因此,我得到了源代码,并开始修改它,而不是从文件加载png,而是从资源加载。我添加了以下代码: HRSRC hRsrc = FindResourceW(N
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
是资源的类型(它们都作为参数传入)<代码>离开是显示弹出消息的自定义功能buffer
是读取png内容的向量
这个库被编译成我自己的代码使用的静态链接库。因此,我的代码实际嵌入了资源。现在,问题是,这是可行的,但只在少数几台计算机上。我能够运行它,这正是我的一个朋友。在任何其他人的计算机上,GetLastError()
返回127,因此程序将退出。根据,错误127是无法找到指定的过程。
…无论这意味着什么
我的可执行文件中还嵌入了其他文件,包括MP3和DLL,它们都是以同样的方式制作的,它们工作得很好(同样,这个png甚至在我自己的计算机上也工作得很好),所以我知道这不是嵌入东西的问题;我想我已经记下来了
那么。。。错误代码127试图告诉我什么?我的用户的计算机不知道如何运行函数FindResourceW吗?如果是这样的话,那就毫无意义了,因为我的代码在其他地方使用了这个函数,用于加载MP3,而且它也可以工作(事实上,在我开始尝试嵌入png之前,它已经工作了)。基本上,我以前从未见过这样的问题,我被难住了| 您没有正确使用或
FindResourceW
(链接在上面)的文档清楚地说明了FindResourceW
返回模块句柄(HRSR
),如果它返回NULL,您应该检查GetLastError
(添加了强调)
返回值
类型:HRSRC
如果函数成功,则返回值是指定资源信息块的句柄。要获取资源的句柄,请将此句柄传递给LoadResource函数
如果函数失败,则返回值为NULL。要获取扩展错误信息,请调用GetLastError。
从GetLastError
上的文档中(再次链接到上面,再次链接到emphasis mine:
返回值
返回值是调用线程的最后一个错误代码
设置最后一个错误代码的每个函数文档的返回值部分都会记录该函数设置最后一个错误代码的条件。大多数设置线程最后一个错误代码的函数都会在失败时设置该错误代码。但是,有些函数在成功时也会设置最后一个错误代码。如果函数未被禁用记录要设置最后一个错误代码,此函数返回的值只是最近设置的最后一个错误代码;某些函数成功时将最后一个错误代码设置为0,而其他函数则不设置。
这意味着,除非函数记录为在成功时设置最后一个错误代码,否则错误代码只能用于指示函数失败时的状态。您的代码假设ifGetLastError
不是0,则FindResourceW
失败,并且该假设是错误的。:-)由于该假设失败,您的代码(错误地)进入if
块,并在不应该的时候调用leave
,这在逻辑上意味着if
块结束后的代码永远不会执行
FindResourceW
只有在失败并返回NULL
时才能清楚地记录到SetLastError
。您假设的错误值来自FindResourceW
代码中设置错误值的其他地方(代码显然没有读取)
<>这将更接近正确使用(不是我自己的C++):
难以置信的而且速度也很快。所以第八天,上帝说。。。让一切都有可能。而且很好……我当时不明白。
GetLastError
从哪里提取127?FindResourceW
是否成功加载了资源,但还是生成了错误?如果是这样的话,它为什么会这样做呢?它是从以前发生错误且未被读取的地方获取的。正如我所说,文档明确指出,只有当函数失败并返回NULL时,才应该使用GetLastError
。在看到它返回的内容之前,您不会知道FindResourceW是否失败。设置错误不是FindResourceW
,除非您看到FindResourceW
实际上失败了。由于您错误地假设它确实存在,并进入了leave()
函数,因此您实际上导致后面的代码无法自己调用。请参阅我编辑的答案。我已经添加了一些关于GetLastError和成功API调用的信息,这些信息可能有助于澄清您看到的内容。Hrm。。好吧,那么。。。我想下一个问题是,为什么我的计算机会以某种方式绕过将最后一个错误设置为127的任何代码。。。但我想这是另一个故事了!
HRSRC hRsrc = FindResourceW(NULL, recName, recType);
if (!hRsrc)
{
char b[100];
leave("Couldn't find resource", itoa(GetLastError(), b, 10));
}