在EXE和DLL中,FindResource的区别
转载:https://blog.csdn.net/ithzhang/article/details/7995102
在EXE和DLL中,FindResource的区别
以下的代码在EXE中,执行无误。可是在DLL中FindResource返回的值就为0了,我用::GetLastError(),得出的值是1813,也就是取不到资源,这是为什么?
- BOOL ExtractFile(char *szZlibFile,DWORD dwRID)
- {
- HANDLE hFile = NULL ;
- HRSRC hRsrc = NULL ;
- HGLOBAL hGlobal = NULL ;
- DWORD dwResSize = 0, dwBytesWrite = 0, dwBytesRead = 0;
- PVOID pRsrc = NULL, pConfigEncrypt = NULL;
- hRsrc = FindResource( NULL, MAKEINTRESOURCE(dwRID), "ZLIB");
- if(hRsrc == NULL)
- {
- MyDbgPrint("[ExtractFile] Locate Resource Error: %d\n", GetLastError());
- return FALSE;
- }
- dwResSize = SizeofResource(NULL, hRsrc);
- hGlobal = LoadResource(NULL, hRsrc);
- if(hGlobal == NULL)
- {
- MyDbgPrint("[ExtractFile] Load Resource Error: %d\n", GetLastError());
- return FALSE;
- }
- pRsrc = LockResource(hGlobal);
- hFile = CreateFile( szZlibFile , GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if(hFile == INVALID_HANDLE_VALUE)
- {
- MyDbgPrint("[ExtractFile] Create %s File Error: %d\n", szZlibFile , GetLastError());
- return FALSE;
- }
- if( WriteFile( hFile, pRsrc, dwResSize, &dwBytesWrite, NULL) == FALSE)
- {
- MyDbgPrint("[ExtractFile] Write %s File Error: %d\n", szZlibFile , GetLastError());
- return FALSE;
- }
- CloseHandle(hFile);
- MyDbgPrint("[ExtractFile] Write %s File Success\n",szZlibFile);
- return TRUE;
- }
问题出在FindResource的第一个参数取得的HINSTANCE句柄是EXE的HINSTANCE句柄,自然在其中也找不到在DLL中引入的ZLIB这个位图ID了.同时SizeofResource,LoadResource中的第一个参数也应该是DLL的句柄.
解决方法如下:
- BOOL ExtractFile(char *szZlibFile,DWORD dwRID)
- {
- HANDLE hFile = NULL ;
- HRSRC hRsrc = NULL ;
- HGLOBAL hGlobal = NULL ;
- DWORD dwResSize = 0, dwBytesWrite = 0, dwBytesRead = 0;
- PVOID pRsrc = NULL, pConfigEncrypt = NULL;
- HINSTANCE hInst = GetModuleHandle( dll的路径 );
- hRsrc = FindResource( hInst , MAKEINTRESOURCE(dwRID), (LPCTSTR)"ZLIB");
- if(hRsrc == NULL)
- {
- return FALSE;
- }
- dwResSize = SizeofResource( hInst , hRsrc);
- hGlobal = LoadResource( hInst , hRsrc);
- if(hGlobal == NULL)
- {
- return FALSE;
- }
- pRsrc = LockResource(hGlobal);
- hFile = CreateFile( szZlibFile , GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if(hFile == INVALID_HANDLE_VALUE)
- {
- return FALSE;
- }
- if( WriteFile( hFile, pRsrc, dwResSize, &dwBytesWrite, NULL) == FALSE)
- {
- return FALSE;
- }
- CloseHandle(hFile);
- return TRUE;
- }
在EXE和DLL中,FindResource的区别的更多相关文章
- C# 获取exe、dll中的图标,支持获取256x256分辨率
在网上找过许多文章,都没有成功获取过大图标,只能获取最大32x32.最后自己尝试了相关的windows api,终于找到一个可用的. 主要用到的C++的PrivateExtractIcons函数,具体 ...
- 动态加载EXE和DLL
程序中加载了一个DLL文件,但生成的EXE在脱离了DLL文件后仍然可以 单独使用,这是动态加载DLL技术.即:调用资源中的DLL. 此技术的好处:EXE可以使用DLL中的函数,但不会额外增加一 个DL ...
- .Net中把图片等文件放入DLL中,并在程序中引用
原文:.Net中把图片等文件放入DLL中,并在程序中引用 [摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵 ...
- C#程序集系列06,程序集清单,EXE和DLL的区别
CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/ 程序集清单 □ 查看程序集清单 →清空F盘as文件夹中的所有内容→创建MainClass.cs文件→ ...
- AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)
使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...
- 在共享DLL中使用MFC 和在静态库中使用MFC的区别
使用VS2008,在项目属性中有一项MFC的使用,有三种设置: 1.使用标准Windows库 2.在共享DLL中使用MFC 3.在静态库中使用MFC 第一种顾名思义. ...
- PE头的应用---插入代码到EXE或DLL文件中
三.代码实现(DELPHI版本),采用第三种方式实现代码插入. 1. 定义两个类,一个用来实现在内存中建立输入表:一个用来实现对PE头的代码插入. DelphiCode: const MAX_SECT ...
- 将DLL文件直接封装进exe执行文件中(C#)
前言:由于项目需要,需制作一个注册机,将个人PC的MAC值和硬盘序列号与软件进行绑定,由于笔者的C++不是很好,所以采用C#进行开发.但在采用C#的时候,获取硬盘的MAC值和序列号的时候又不是很准确, ...
- dll中使用exe中的变量
注意:输出目录为:Result共享目录 1.exe项目: // EXE.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" extern" ...
随机推荐
- Redis与Python的交互
驱动模块 redis模块用来在Python环境下驱动Redis数据库 可以直接用pip方式安装 pip install redis 或者国内镜像下载: pip install -i https://p ...
- POJ2282 The Counting Problem
题意 Language:DefaultEspañol The Counting Problem Time Limit: 3000MS Memory Limit: 65536K Total Submis ...
- python中的一切皆对象
python中一切皆对象是这个语言灵活的根本.函数和类也是对象,属于python的一等公民.包括代码包和模块也都是对象.python的面向对象更加彻底. 可以赋值给一个变量可以添加到集合对象中可以作为 ...
- Tensorflow细节-P84-梯度下降与批量梯度下降
1.批量梯度下降 批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新.从数学上理解如下: 对应的目标函数(代价函数)即为: (1)对目标函数求偏导: (2)每次迭代对参数进 ...
- Qt读写三种文件,QSettings读ini配置文件,QJsonDocument读JSON文件,QDomDocument读xml文件
第一种INI配置文件 .ini 文件是Initialization File的缩写,即初始化文件. 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户 ...
- PHP中使用 Memcached 的测试案例
<?php class MemcacheController extends ControllerBase { public function indexAction() { session_s ...
- CF gym 100962D Deep Purple [后缀树,树链剖分,线段树]
Codeforces 思路 感觉这个离线的思路好神仙啊qwq 对于每个询问\([l,r]\)其实就是要求\(p_{max}\),使得\(lcs(s[1,p],s[1,r])>p-l\),也就是\ ...
- 1066 Root of AVL Tree (25)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- Pytest权威教程11-模块及测试文件中集成doctest测试
目录 模块及测试文件中集成doctest测试 编码 使用doctest选项 输出格式 pytest-specific 特性 返回: Pytest权威教程 模块及测试文件中集成doctest测试 编码 ...
- 【知识点】Java机密
Java添加PDF图章.动态图章 主要实现以下功能: 添加图片图章.即通过加载现有的图章(以图片形式),添加到PDF指定页面位置 添加动态图章.即加载PDF文档,并在动态的添加印章内容,包括印章字样. ...