转载: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\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句柄是EXE的HINSTANCE句柄,自然在其中也找不到在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.  
    }

在EXE和DLL中,FindResource的区别的更多相关文章

  1. C# 获取exe、dll中的图标,支持获取256x256分辨率

    在网上找过许多文章,都没有成功获取过大图标,只能获取最大32x32.最后自己尝试了相关的windows api,终于找到一个可用的. 主要用到的C++的PrivateExtractIcons函数,具体 ...

  2. 动态加载EXE和DLL

    程序中加载了一个DLL文件,但生成的EXE在脱离了DLL文件后仍然可以 单独使用,这是动态加载DLL技术.即:调用资源中的DLL. 此技术的好处:EXE可以使用DLL中的函数,但不会额外增加一 个DL ...

  3. .Net中把图片等文件放入DLL中,并在程序中引用

    原文:.Net中把图片等文件放入DLL中,并在程序中引用 [摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵 ...

  4. C#程序集系列06,程序集清单,EXE和DLL的区别

    CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/ 程序集清单 □ 查看程序集清单 →清空F盘as文件夹中的所有内容→创建MainClass.cs文件→ ...

  5. AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)

    使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...

  6. 在共享DLL中使用MFC 和在静态库中使用MFC的区别

    使用VS2008,在项目属性中有一项MFC的使用,有三种设置: 1.使用标准Windows库 2.在共享DLL中使用MFC 3.在静态库中使用MFC          第一种顾名思义.        ...

  7. PE头的应用---插入代码到EXE或DLL文件中

    三.代码实现(DELPHI版本),采用第三种方式实现代码插入. 1. 定义两个类,一个用来实现在内存中建立输入表:一个用来实现对PE头的代码插入. DelphiCode: const MAX_SECT ...

  8. 将DLL文件直接封装进exe执行文件中(C#)

    前言:由于项目需要,需制作一个注册机,将个人PC的MAC值和硬盘序列号与软件进行绑定,由于笔者的C++不是很好,所以采用C#进行开发.但在采用C#的时候,获取硬盘的MAC值和序列号的时候又不是很准确, ...

  9. dll中使用exe中的变量

    注意:输出目录为:Result共享目录 1.exe项目: // EXE.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" extern" ...

随机推荐

  1. 关于JDBCUtils的模糊查询问题

    1.JDBCUtils的模糊查询问题解决方法 数据库jdbc工具类的模糊查询最核心的就是用like %内容%,但是我们对于界面输入进来的东西都是用?来替代的,那么就代表着我们不能吧%%写在问号旁边.否 ...

  2. 【测试用例工具】TestLinked的使用实例(转)

    转自:https://blog.csdn.net/ikoqzurydr/article/details/81630510

  3. 黄杉杉 --java第八次作业

    题目:编写一个应用程序,创建一个矩形类,类中具有长.宽两个成员变量和求周长的方法.再创建一个矩形类的子类——正方形类,类中定义求面积方法.重写求周长的方法.在主类中,输入一个正方形边长,创建正方形对象 ...

  4. eclipse更改jdk版本(1.6》1.7 以此类推)

    电脑装了两个版本的JDK,在开发项目的时候默认使用的是高版本的,但是公司又要求用低版本的JDK来编译,肿么办???么事,小编这就来给你支招! eclipse 安装两个版本的JDK 1 打开eclips ...

  5. 使用LoadRunner脚本并发下载文件,出现19890错误

    需求:10个客户并发下载同一份zip文件.执行的时候,8个Fail了,只下载了两份zip,且无论执行多少遍,都是这样. 错误信息如下:message code:-19890C interpreter ...

  6. Python 的内置字符串方法(收藏专用)

    Python 的内置字符串方法(收藏专用) method 字符串 string python3.x  python 4.7k 次阅读  ·  读完需要 44 分钟 5 字符串处理是非常常用的技能,但 ...

  7. django 第五天 自定义标签 静态文件

    昨日忘记上传,先预留位置,稍后补上

  8. 洛谷 P2827 蚯蚓 题解

    每日一题 day32 打卡 Analysis 我们可以想一下,对于每一秒除了被切的哪一个所有的蚯蚓都增长Q米,我们来维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那一部 ...

  9. h5页面滑动卡顿解决方法

    解决方式: 给滚动的元素加样式:-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling(允许独立的滚动区域和触摸回弹) 如果值为au ...

  10. leetcode解题报告(27):Reverse Linked List

    描述 Reverse a singly linked list. 分析 一开始写的时候总感觉没抓到要点,然后想起上数据结构课的教材上有这道题,翻开书一看完就回忆起来了,感觉解法挺巧妙的,不比讨论区的答 ...