【发布时间】:2019-07-18 22:04:48
【问题描述】:
我正在编写一个 C++ 程序,它需要处理大量数据,特别是文本文件,但是数据长于给定的字符串限制。结果,我尝试将文本文件加载为资源文件,但是每当我调用 FindResource 时,响应都是空句柄。
我已经查看了其他堆栈溢出帖子,并且 MSDN 尝试正确实现此功能,但是我尝试过的没有返回有效句柄。
C++ 代码:
HGLOBAL res_handle = NULL;
HRSRC res;
char * res_data;
DWORD res_size;
auto g_hInstance = GetModuleHandle(NULL);
res = FindResource(g_hInstance, MAKEINTRESOURCE(MY_RESOURCE), RT_RCDATA);
std::cout << res << std::endl;
std::cout << GetLastError() << std::endl;
res_handle = LoadResource(NULL, res);
std::cout << GetLastError() << std::endl;
res_data = (char*)LockResource(res_handle);
std::cout << GetLastError() << std::endl;
res_size = SizeofResource(NULL, res);
std::cout << GetLastError() << std::endl;
输出:
0000000000000000
1813
87
87
87
资源.h:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Resource.rc
//
#define MY_RESOURCE 300
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40002
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
资源.rc:
MY_RESOURCE RCDATA "C:\\Users\\foobar\\Desktop\\projects\\foobar\\test0.txt"
【问题讨论】:
-
将 int 更改为名称并在不使用 MAKEINTRESOURCE 的情况下使用它。
-
您可以在您的 EXE 中检查资源。在 Visual Studio 中,执行
File > Open > File,选择您的 EXE,然后单击打开按钮旁边的小箭头并选择Open With > Resource Editor。检查您要查找的资源是否确实存在。很可能,问题出在构建上。 -
感谢 Igor 的评论,在 Visual Studio 中,我可以在资源文件 -> Resource.rc -> RCDATA 中看到实际资源。除非我弄错了你的意思。
-
我将您建议 Michael 的代码行更改为“res = FindResource(g_hInstance, (LPCTSTR)MY_RESOURCE, RT_RCDATA);”并得到相同的输出。
-
就像我说的,检查资源是否实际存在于您的项目构建的 EXE 文件中。
标签: c++ windows embedded-resource