FindResource 如何获取自定义资源

99 篇文章 0 订阅

在.exe中可以这样添加和访问:

1,添加数据/资源:

在resource(资源)中 通过 “Add resource -> Import...”选择需要添加的 数据/资源,其中的 resource type 可以自己命名,

需要注意的是需要利用字符串命名,譬如可以为"MYRESTYPE",资源ID可以为字符串,譬如为"IDR_DATA",也可以使ID譬如为IDR_DATA,这两种方式在使用Findresource函数是有所区别。

 

2,访问数据/资源:

在.exe中当前load的resource即为.exe中的resource,因此在使用FindResource,LoadResource时,参数hModule可以为NULL。具体使用如下:


 // string 方式  
HRSRC hr = ::FindResource(NULL,L"IDR_HAARCASCADE",L"MYRESTYPE");  
if (NULL == hr)  
{  
    int ierr = GetLastError();  
    return false;  
}  
ULONG nResSize = ::SizeofResource(NULL,hr);  // Data size/length  
HGLOBAL hG= ::LoadResource(NULL, hr);  
if (NULL == hG || nResSize <= 0)  
{  
    //fail  
}  
LPBYTE pData = (LPBYTE)LockResource(hG);    // Data Ptr  
// ID方式  
CString strItem = MAKEINTRESOURCE(IDR_HAARCASCADE);  
HRSRC hr = ::FindResource(NULL,strItem,L"MYRESTYPE");  
if (NULL == hr)  
{  
    int ierr = GetLastError();  
    return false;  
}  
ULONG nResSize = ::SizeofResource(NULL,hr);  // Data size/length  
HGLOBAL hG= ::LoadResource(NULL, hr);  
if (NULL == hG || nResSize <= 0)  
{  
    //fail  
}  
LPBYTE pData = (LPBYTE)LockResource(hG);    // Data Ptr  

上述方法在DLL中会出现错误,通过GetLastError会得到错误码0x00000715 ,通过Error Lookup 可以发现是 “找不到映像文件中指定的类型”,这是因为此时defaultresource是load此dll的.exe中的resource,需要设置为dll中的resource方可访问。

具体为:

 HMODULE ghmodule = GetModuleHandle(L"test.dll");  
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);  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值