1. 程式人生 > >MFC中FindResource如何獲取自定義資源

MFC中FindResource如何獲取自定義資源

在.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);