这里有一个简单的示例,我想将一些嵌入式文本文件加载到应用程序中,但是当我使用FindResourceW
时,会出现编译时错误:
HGLOBAL res_handle = NULL;
HRSRC res;
wchar_t* res_data;
DWORD res_size;
// NOTE: providing g_hInstance is important, NULL might not work
res = FindResourceW(GetModuleHandleW(NULL), MAKEINTRESOURCEW(MY_RESOURCE), RT_RCDATA);
if (!res)
return 1;
在我的
.rc
文件中,我定义了如下资源:MY_RESOURCE RCDATA L"Help topics.txt"
错误:
严重性代码说明项目文件行错误C2664'HRSRC
FindResourceW(HMODULE,LPCWSTR,LPCWSTR)':无法转换参数3
从“ LPSTR”到
'LPCWSTR'FindFilesProj C:\ Users \ WongFei \ Desktop \ FindFilesProj
UNICODE \ WinMain.cpp 674
最佳答案
您正在使用RT_RCDATA
,其定义为:
#define RT_RCDATA MAKEINTRESOURCE(10)
并且
MAKEINTRESOURCE()
定义为:#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
#ifdef UNICODE
#define MAKEINTRESOURCE MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE MAKEINTRESOURCEA
#endif // !UNICODE
您有一个未定义
UNICODE
的项目。因此MAKEINTRESOURCE()
返回一个char*
,但是FindeResourceW()
想要一个wchar_t*
。从而导致编译器错误。如果未定义RT_RCDATA
,则不能将FindResourceW()
原样与UNICODE
结合使用。使用
FindResource()
代替FindResourceW()
。这可以确保MAKEINTRESOURCE()
返回与FindResource()
期望相同类型的指针(UNICODE或非UNICODE):res = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(MY_RESOURCE), RT_RCDATA);
否则,您必须将
RT_RCDATA
强制转换为wchar_t*
以符合FindResourceW()
的期望: res = FindResourceW(GetModuleHandleW(NULL), MAKEINTRESOURCEW(MY_RESOURCE), (LPWSTR)RT_RCDATA);
类型转换是安全的。
请记住,您的资源是以创建方式存储的。可能需要将其转换为所需的正确字符模式。