好的......所以我正在使用 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 之前,它已经奏效了)。基本上,我以前从未见过这种问题,我被难住了。:|