有时候我们需要把一些图片、语言包等各种各样的资源文件打包到DLL中,程序初次运行的时候,我们可以将那些文件释放出来,这样非常方便。当然也可以打包到exe文件中,原理都是一样的,利用FindResource相关函数即可。但是需要注意的是,
DLL中使用该系列函数和exe中执行该函数是有区别的:
HMODULE ghmodule = GetModuleHandle(L"test.dll");
if(NULL == ghmodule)
return false;
HRSRC hr = ::FindResource(ghmodule,L"IDR_DATA",L"MYRESTYPE");
if (NULL == hr)
{
int ierr = GetLastError();
return false;
}
ULONG nResSize = ::SizeofResource(ghmodule,hr);
HGLOBAL hG= ::LoadResource(ghmodule, hr);
if (NULL == hG || nResSize <= 0)
{
return false;
}
LPBYTE pData = (LPBYTE)LockResource(hG);
在exe中,FindResource相关函数的第一个参数可以为NULL,表示当前模块,但是DLL中执行该函数时,参数使用NULL的话则代表在调用该DLL的程序的资源文件中搜索。所以该函数始终会返回空,搜索不到资源!
通过GetModuleHandle可以获取到该DLL在当前进程空间中的位置,参数为DLL的字符串名称。