0

A simple example here I want to load some embedded text file to my application but when I use FindResourceW I get compile-time error:

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;

In my .rc file I defined the resource like this:

MY_RESOURCE RCDATA    L"Help topics.txt"

The error:

Severity Code Description Project File Line Error C2664 'HRSRC FindResourceW(HMODULE,LPCWSTR,LPCWSTR)': cannot convert argument 3 from 'LPSTR' to 'LPCWSTR' FindFilesProj C:\Users\WongFei\Desktop\FindFilesProj UNICODE\WinMain.cpp 674

David Heffernan
  • 601,492
  • 42
  • 1,072
  • 1,490
WonFeiHong
  • 445
  • 4
  • 16

1 Answers1

3

You are using RT_RCDATA, which is defined as:

#define RT_RCDATA           MAKEINTRESOURCE(10)

And MAKEINTRESOURCE() is defined as:

#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

You have a project were UNICODE isn't defined. So MAKEINTRESOURCE() returns a char* but FindeResourceW() wants a wchar_t* instead. Thus the compiler error. You can't use RT_RCDATA as-is in combination with FindResourceW() when UNICODE isn't defined.

Use FindResource() instead of FindResourceW(). This makes sure that MAKEINTRESOURCE() returns a pointer of the same type (UNICODE or non-UNICODE) that FindResource() expects:

res = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(MY_RESOURCE), RT_RCDATA);

Otherwise, you have to type-cast RT_RCDATA to wchar_t* to match what FindResourceW() expects:

 res = FindResourceW(GetModuleHandleW(NULL), MAKEINTRESOURCEW(MY_RESOURCE), (LPWSTR)RT_RCDATA);

The type-cast is safe.

Remember that your resource is stored in the way you created it. There may be need to convert it into the proper character mode you need.

Remy Lebeau
  • 555,201
  • 31
  • 458
  • 770
xMRi
  • 14,982
  • 3
  • 26
  • 59