在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;
}
转载于:https://www.cnblogs.com/gakusei/articles/1352642.html
在EXE和DLL中,FindResource的区别相关推荐
- 主题:EXE + BPL + DLL + Interface实现插件式客户端解决方案
时间:2005-02-25(星期五) 15:00(下午三点) 主题:浅谈怎样利用EXE + BPL + DLL + Interface实现插件式客户端解决方案 地点:群号:5726882(煮茶待英雄会 ...
- 在共享DLL中使用MFC 和在静态库中使用MFC的区别
win7:vc6: 使用VS2008,在项目属性中有一项MFC的使用,有三种设置: 1.使用标准Windows库 2.在共享DLL中使用MFC 3.在静态库中使用MFC 第一种顾名思义. ...
- 用实例证明dll中new的内存不能在exe中释放
VC中新建一个dll工程,设置使用"多线程调试DLL (/MDd)".该dll导出以下alloc函数: [cpp] view plaincopy __declspec( dllex ...
- 执行exe报计算机中丢失qtdll,Qt入门教程(2) 直接运行Qt生成的exe报错缺少dll文件 | 阿拉灯...
摘要 在Qt Creator中写完程序,在Qt Creator中的debug或者release状态下运行程序都是没有问题的,并且会在工程目录下生成对应的debug或者release文件夹,里面存放着生 ...
- AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)...
使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...
- 将dumpbin从VS中抠出来,并使用dumpbin查看exe和dll库的依赖关系
目录 1.初步说明 2.在开发的机器上使用dumpbin工具查看dll库的依赖关系 3.将dumpbin.exe从Visual Studio中抠出来 3.1.找到dumpbin.exe文件及其依赖的d ...
- [转]关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...
关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决 转自:http://hi.baidu.com/qinfen ...
- C++ Builder创建和调用dll中的资源
程序开发中经常会用到一些图标.图片.光标.声音等,我们称它们为资源(Resource).当多个窗口用到同样的资源时,可以将这些公共的资源放到一个dll文件里调用,这样,由于定位资源比在磁盘中定位文件花 ...
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...
转自:http://hi.baidu.com/qinfengxiaoyue/item/ff262ccfb53b4c2ba0b50a89 引自:http://blog.csdn.net/sptoor/a ...
最新文章
- linux什么命令只显示ip,linux ip命令
- pythongui界面实例带注释_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...
- 谈谈Backlog梳理活动
- java基础-基本的输入与输出
- java简单线程池实例代码
- [记录]-Cortex-A76仅EL0支持aarch32
- centos7下php设置用户和组,centos系统添加/删除用户和用户组的例子
- 测试两个主机之间的连通性_借助网络测试神器极速解决网络故障
- 谷歌浏览器不能上网_谷歌浏览器插件下载及安装教程!
- 企业项目开发中的问题
- ct与x光的哪个辐射大_ct和x光哪个辐射大
- 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时6
- 将本地的代码提交到github仓库
- 教程 参数设置_呼吸机的使用方法教程及参数设置
- c语言程序填空题库,c语言填空题题库
- html 画布 重置,html5实现清空画布的三种方法
- 国家级示范高等职业院校网址
- vue.js 的学习之路
- OpenWrt之IPTV单线复用详细教程
- 交叉编译OpenCV3.4.1报错
热门文章
- 一个简易上手的短信服务Spring Boot Starter,连傻瓜都会!
- Lambda 表达式有何用处?
- Nomad技术手册:共识协议(Consensus Protocol)
- 阳泉师范高等专科学校计算机系,阳泉师范高等专科学校
- python兼容性怎么样_Python与exe的兼容性
- 五大关键物联网应用助力优化数据中心基础设施管理
- 解决数据中心管综难题:管线避让的十七个原则!
- 夏天雷雨天机房断电了,该怎么办?,叫你几招紧急应对方法
- python可变参数的特点_可变参数**kwargs传入函数时的存储方式为( )_学小易找答案...
- shell怎么把负数变成正数_excel怎么计算平方根-记住简单的收藏复杂的