分享

在EXE和DLL中,FindResource的区别

 求真我 2014-04-20

     在EXE和DLL中,FindResource的区别    

     以下的代码在EXE中,执行无误。可是在DLL中FindResource返回的值就为0了,我用::GetLastError(),得出的值是1813,也就是取不到资源,这是为什么?

  1. BOOL ExtractFile(char *szZlibFile,DWORD    dwRID)  
  2. {  
  3.     HANDLE    hFile = NULL ;  
  4.     HRSRC    hRsrc = NULL ;  
  5.     HGLOBAL hGlobal = NULL ;  
  6.   
  7.     DWORD    dwResSize = 0, dwBytesWrite = 0, dwBytesRead = 0;  
  8.     PVOID    pRsrc = NULL, pConfigEncrypt = NULL;  
  9.     hRsrc = FindResource( NULL, MAKEINTRESOURCE(dwRID), "ZLIB");  
  10.     if(hRsrc == NULL)  
  11.     {  
  12.         MyDbgPrint("[ExtractFile] Locate Resource Error: %d\n", GetLastError());  
  13.         return FALSE;  
  14.     }  
  15.   
  16.     dwResSize = SizeofResource(NULL, hRsrc);  
  17.   
  18.     hGlobal = LoadResource(NULL, hRsrc);  
  19.     if(hGlobal == NULL)  
  20.     {  
  21.         MyDbgPrint("[ExtractFile] Load Resource Error: %d\n", GetLastError());  
  22.         return FALSE;  
  23.     }  
  24.   
  25.     pRsrc = LockResource(hGlobal);  
  26.   
  27.     hFile = CreateFile( szZlibFile , GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  
  28.     if(hFile == INVALID_HANDLE_VALUE)  
  29.     {  
  30.         MyDbgPrint("[ExtractFile] Create %s File Error: %d\n", szZlibFile , GetLastError());  
  31.         return FALSE;  
  32.     }  
  33.   
  34.     if( WriteFile( hFile, pRsrc, dwResSize, &dwBytesWrite, NULL) == FALSE)  
  35.     {  
  36.         MyDbgPrint("[ExtractFile] Write %s File Error: %d\n", szZlibFile , GetLastError());  
  37.         return FALSE;  
  38.     }  
  39.     CloseHandle(hFile);  
  40.     MyDbgPrint("[ExtractFile] Write %s File Success\n",szZlibFile);  
  41.     return TRUE;  
  42.   
  43. }   


       问题出在FindResource的第一个参数取得的HINSTANCE句柄是EXEHINSTANCE句柄,自然在其中也找不到在DLL中引入的ZLIB这个位图ID.同时SizeofResource,LoadResource中的第一个参数也应该是DLL的句柄.

解决方法如下:

  1. <span style="font-size:18px;">BOOL ExtractFile(char *szZlibFile,DWORD    dwRID)  
  2.   
  3. {  
  4.   
  5.     HANDLE    hFile = NULL ;  
  6.   
  7.     HRSRC    hRsrc = NULL ;  
  8.   
  9.     HGLOBAL hGlobal = NULL ;  
  10.   
  11.     DWORD    dwResSize = 0, dwBytesWrite = 0, dwBytesRead = 0;  
  12.   
  13.     PVOID    pRsrc = NULL, pConfigEncrypt = NULL;  
  14.   
  15.     HINSTANCE hInst = GetModuleHandle( dll的路径 );  
  16.   
  17.     hRsrc = FindResource( hInst , MAKEINTRESOURCE(dwRID), (LPCTSTR)"ZLIB");  
  18.   
  19.     if(hRsrc == NULL)  
  20.   
  21.     {  
  22.   
  23.         return FALSE;  
  24.   
  25.     }  
  26.   
  27.     dwResSize = SizeofResource( hInst , hRsrc);  
  28.   
  29.     hGlobal = LoadResource( hInst , hRsrc);  
  30.   
  31.     if(hGlobal == NULL)  
  32.   
  33.     {  
  34.   
  35.         return FALSE;  
  36.   
  37.     }  
  38.   
  39.     pRsrc = LockResource(hGlobal);  
  40.   
  41.     hFile = CreateFile( szZlibFile , GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  
  42.   
  43.     if(hFile == INVALID_HANDLE_VALUE)  
  44.   
  45.     {  
  46.   
  47.         return FALSE;  
  48.   
  49.     }  
  50.   
  51.     if( WriteFile( hFile, pRsrc, dwResSize, &dwBytesWrite, NULL) == FALSE)  
  52.   
  53.     {  
  54.   
  55.         return FALSE;  
  56.   
  57.     }  
  58.   
  59.     CloseHandle(hFile);  
  60.   
  61.     return TRUE;  
  62.   
  63. }</span>  


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多