这里有一个简单的示例,我想将一些嵌入式文本文件加载到应用程序中,但是当我使用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);


类型转换是安全的。

请记住,您的资源是以创建方式存储的。可能需要将其转换为所需的正确字符模式。

10-08 06:41