zoukankan      html  css  js  c++  java
  • 在EXE和DLL中,FindResource的区别

    转载:https://blog.csdn.net/ithzhang/article/details/7995102

         在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 ", 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 ", 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 ", 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 ", szZlibFile , GetLastError());
    37.  
      return FALSE;
    38.  
      }
    39.  
      CloseHandle(hFile);
    40.  
      MyDbgPrint("[ExtractFile] Write %s File Success ",szZlibFile);
    41.  
      return TRUE;
    42.  
       
    43.  
      }


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

    解决方法如下:

    1.  
      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.  
      }

  • 相关阅读:
    Java Socket通信读取相关信息代码
    Java Socket编程如何建立两者关系
    浅谈JAVA中如何利用socket进行网络编程(二)
    浅谈JAVA中如何利用socket进行网络编程(一)
    【Java TCP/IP Socket】TCP Socket(含代码)
    HTTP协议
    HTTP协议详解
    TCP/IP协议与Http协议的区别
    MultipartResolver实现文件上传功能
    ***CodeIgnite/CI 去掉 index.php的 配置
  • 原文地址:https://www.cnblogs.com/kuangke/p/10901497.html
Copyright © 2011-2022 走看看