FindResource 如何獲取自定義資源


來自:https://blog.csdn.net/qing666888/article/details/49756941

 

在.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。具體使用如下:

  1. // string 方式
  2.  HRSRC hr = ::FindResource( NULL,L"IDR_HAARCASCADE",L"MYRESTYPE");
  3.   if (NULL == hr)
  4.  {
  5.   int ierr = GetLastError();
  6.   return false;
  7.  }
  8.  ULONG nResSize = ::SizeofResource( NULL,hr); // Data size/length
  9.  HGLOBAL hG= ::LoadResource( NULL, hr);
  10.   if (NULL == hG || nResSize <= 0)
  11.  {
  12.   //fail
  13.  }
  14.  LPBYTE pData = (LPBYTE)LockResource(hG); // Data Ptr
  15.   // ID方式
  16.  CString strItem = MAKEINTRESOURCE(IDR_HAARCASCADE);
  17.  HRSRC hr = ::FindResource( NULL,strItem,L"MYRESTYPE");
  18.   if (NULL == hr)
  19.  {
  20.   int ierr = GetLastError();
  21.   return false;
  22.  }
  23.  ULONG nResSize = ::SizeofResource( NULL,hr); // Data size/length
  24.  HGLOBAL hG= ::LoadResource( NULL, hr);
  25.   if (NULL == hG || nResSize <= 0)
  26.  {
  27.   //fail
  28.  }
  29.  LPBYTE pData = (LPBYTE)LockResource(hG); // Data Ptr

上述方法在DLL中會出現錯誤,通過GetLastError會得到錯誤碼0x00000715 ,通過Error Lookup 可以發現是 “找不到映像文件中指定的類型”,這是因為此時defaultresource是load此dll的.exe中的resource,需要設置為dll中的resource方可訪問。

具體為:

  1. HMODULE ghmodule = GetModuleHandle( L"test.dll");
  2.  HRSRC hr = ::FindResource(ghmodule, L"IDR_DATA",L"MYRESTYPE");
  3.   if (NULL == hr)
  4.  {
  5.   int ierr = GetLastError();
  6.   return false;
  7.  }
  8.  ULONG nResSize = ::SizeofResource(ghmodule,hr);
  9.  HGLOBAL hG= ::LoadResource(ghmodule, hr);
  10.   if (NULL == hG || nResSize <= 0)
  11.  {
  12.   return false;
  13.  }
  14.  LPBYTE pData = (LPBYTE)LockResource(hG);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM