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);
posted @ 2021-01-13 09:48  宇宙之外  阅读(1668)  评论(0编辑  收藏  举报