FindResourceW()返回错误代码127
FindResourceW() returns error code 127
好的。。。所以我正在使用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之前,它已经起作用了)。基本上,我以前从未见过这种问题,我被难住了
您没有正确使用GetLastError
或FindResourceW
。
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));
}
- 当命令失败时,gzip 会在 C++ 中返回错误代码吗?
- 从 C++ 调用 cURL 命令会返回意外的错误代码,如 1792 和 6656
- openCL-创建子缓冲区返回错误代码13
- 为什么我的代码返回了错误的平方值?C++
- 如何从构造函数返回错误代码?
- 如何使用 RAII 包装返回错误代码的 C 分配
- ChangeWindowMessageFilterEx() 返回错误代码 5
- Fibbonaci 递归代码返回错误值,始终返回下一个数字
- 为什么此代码返回分段错误错误?
- mmdevice API中的cocreateinstance返回错误代码0x800401f0
- Ubuntu E:子进程 /usr/bin/dpkg 返回错误代码 (1)
- 如何避免使用多个if-else来检查返回值是否为错误代码?
- SQLite 错误代码:sqlite_step() 返回 5 (SQLITE_BUSY)
- JNI 代码返回字符串,但得到错误 java.lang.UnsatisfiedLinkError: com.packag
- 使用Outlook 2016:MAPISendMail在Windows应用程序中失败,并返回"MAPI_E_FAILURE"作为错误代码
- 获取 Poco 返回的错误代码的文本
- GetProcAddress 在 c++ 中返回错误代码 127
- 尝试从资源加载位图返回NULL,错误代码为1813
- 开发人员在Dev C 中编译代码时,我会收到此错误:[错误] ID返回1退出状态
- C++错误处理-使用std::pair或std::tuple返回错误代码和函数返回的缺点