以下的代码在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的区别相关推荐

  1. 主题:EXE + BPL + DLL + Interface实现插件式客户端解决方案

    时间:2005-02-25(星期五) 15:00(下午三点) 主题:浅谈怎样利用EXE + BPL + DLL + Interface实现插件式客户端解决方案 地点:群号:5726882(煮茶待英雄会 ...

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

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

  3. 用实例证明dll中new的内存不能在exe中释放

    VC中新建一个dll工程,设置使用"多线程调试DLL (/MDd)".该dll导出以下alloc函数: [cpp] view plaincopy __declspec( dllex ...

  4. 执行exe报计算机中丢失qtdll,Qt入门教程(2) 直接运行Qt生成的exe报错缺少dll文件 | 阿拉灯...

    摘要 在Qt Creator中写完程序,在Qt Creator中的debug或者release状态下运行程序都是没有问题的,并且会在工程目录下生成对应的debug或者release文件夹,里面存放着生 ...

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

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

  6. 将dumpbin从VS中抠出来,并使用dumpbin查看exe和dll库的依赖关系

    目录 1.初步说明 2.在开发的机器上使用dumpbin工具查看dll库的依赖关系 3.将dumpbin.exe从Visual Studio中抠出来 3.1.找到dumpbin.exe文件及其依赖的d ...

  7. [转]关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...

    关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决 转自:http://hi.baidu.com/qinfen ...

  8. C++ Builder创建和调用dll中的资源

    程序开发中经常会用到一些图标.图片.光标.声音等,我们称它们为资源(Resource).当多个窗口用到同样的资源时,可以将这些公共的资源放到一个dll文件里调用,这样,由于定位资源比在磁盘中定位文件花 ...

  9. 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...

    转自:http://hi.baidu.com/qinfengxiaoyue/item/ff262ccfb53b4c2ba0b50a89 引自:http://blog.csdn.net/sptoor/a ...

最新文章

  1. linux什么命令只显示ip,linux ip命令
  2. pythongui界面实例带注释_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...
  3. 谈谈Backlog梳理活动
  4. java基础-基本的输入与输出
  5. java简单线程池实例代码
  6. [记录]-Cortex-A76仅EL0支持aarch32
  7. centos7下php设置用户和组,centos系统添加/删除用户和用户组的例子
  8. 测试两个主机之间的连通性_借助网络测试神器极速解决网络故障
  9. 谷歌浏览器不能上网_谷歌浏览器插件下载及安装教程!
  10. 企业项目开发中的问题
  11. ct与x光的哪个辐射大_ct和x光哪个辐射大
  12. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时6
  13. 将本地的代码提交到github仓库
  14. 教程 参数设置_呼吸机的使用方法教程及参数设置
  15. c语言程序填空题库,c语言填空题题库
  16. html 画布 重置,html5实现清空画布的三种方法
  17. 国家级示范高等职业院校网址
  18. vue.js 的学习之路
  19. OpenWrt之IPTV单线复用详细教程
  20. 交叉编译OpenCV3.4.1报错

热门文章

  1. 一个简易上手的短信服务Spring Boot Starter,连傻瓜都会!
  2. Lambda 表达式有何用处?
  3. Nomad技术手册:共识协议(Consensus Protocol)
  4. 阳泉师范高等专科学校计算机系,阳泉师范高等专科学校
  5. python兼容性怎么样_Python与exe的兼容性
  6. 五大关键物联网应用助力优化数据中心基础设施管理
  7. 解决数据中心管综难题:管线避让的十七个原则!
  8. 夏天雷雨天机房断电了,该怎么办?,叫你几招紧急应对方法
  9. python可变参数的特点_可变参数**kwargs传入函数时的存储方式为( )_学小易找答案...
  10. shell怎么把负数变成正数_excel怎么计算平方根-记住简单的收藏复杂的