Win32资源(Resources)其实是一块标记为.rsrc的只读内存,使用FindResource、LoadResource、LockResource三步就能直接访问,并且因为是直接访问的这一块内存,所以不需要释放它们。
这其中字符串资源是比较奇特的一种资源。首先,它是16个一组打包存放的,真实的ID并不是字符串表中设定的ID,而是(ID>>4)+1;其次,字符串并不是按照标准的C字符串存放的,也不是等距离存放的,而是先存放一个unsigned short的长度值,再存放0-65535个wchar_t表示的Unicode字符。
其实我们没有必要这么费力地去分析字符串资源,字符串资源最多只有65535个字符,因此分配65536个字符的的wchar_t数组,然后使用LoadString加载即可。
<code class="language-cpp">// main.cpp
#include <windows.h>
#include <string.h>
__declspec(thread) static wchar_t g_resstr[65536];
bool LoadResString(HMODULE hmod, unsigned short id)
{
HRSRC hres = FindResource(hmod, MAKEINTRESOURCE((id >> 4) + 1), RT_STRING);
HGLOBAL hglb = LoadResource(hmod, hres);
const wchar_t *ptr = (const wchar_t *)LockResource(hglb);
int size = SizeofResource(hmod, hres);
const wchar_t *pend = ptr + size / sizeof (wchar_t);
int idx = id & 0x000f;
while(idx > 0 && ptr < pend)
{
ptr += 1 + *ptr;
idx--;
}
if(ptr >= pend) return false;
if(*ptr == 0) return false;
wmemcpy(g_resstr, ptr + 1, *ptr);
g_resstr[*ptr] = 0;
return true;
}
int main()
{
LoadResString(NULL, 1001);
MessageBox(NULL, g_resstr, L"资源字符串", MB_OK);
return 0;
}
</string.h></windows.h></code>
200字以内,仅用于支线交流,主线讨论请采用回复功能。