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;

}

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/vc/

问题出在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;
}

testcs_dn解决方案记录:

定义全局变量:

HINSTANCEg_hInstance;

CString g_szDllPath = "";

DLL构造函数中初始化全局变量:

DEFAULTSKIN_API CDefaultSkinApp::CDefaultSkinApp() // : CWinApp(NULL)
{
    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
    InitSkinLib(_T("blue"));
    CString appPath;
    ::GetModuleFileName(AfxGetApp()->m_hInstance,  appPath.GetBuffer(MAX_PATH), MAX_PATH);
    appPath.ReleaseBuffer();
    int pos = appPath.ReverseFind('\\');
    if (pos != -1){
        g_szDllPath.Format(_T("%s%s"), appPath.Left(pos + 1), _T("DefaultSkin.dll"));
    }
    if (!g_szDllPath.IsEmpty()){
        g_hInstance = GetModuleHandle(g_szDllPath);
    }
}

FindResource中使用g_hInstance

OK,问题解决!

突然在搜索结果中发现:AFX_MANAGE_STATE(AfxGetStaticModuleState());

AFX_MANAGE_STATE(AfxGetStaticModuleState());

HINSTANCE hInst =  AfxGetResourceHandle();//g_hInstance; //AfxGetInstanceHandle(); //

HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nResID), _T("PNG"));

这才是上好的解决之道

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索return
, null
, false
GetLastError()
dll exe 区别、dll和exe区别、dll与exe区别、findresource、wpf findresource,以便于您获取更多的相关知识。

时间: 2024-10-03 16:41:25

EXE和DLL中FindResource的区别的相关文章

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

原文:.Net中把图片等文件放入DLL中,并在程序中引用 [摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵. 本文就讲述了如何把文件(比如图片,WORD文档等等) 隐藏到DLL中,然后在程序中可以自己根据需要导出图片进行处理. 注:本站原创,转载请注明本站网址:http://www.beinet.cn/blog/ [全文] 第1步: 我们要生成一个资源文件,先把要隐藏的文件放入到这个资源文件中 (资源文

怎样从一个DLL中导出一个C++类

原文作者:Alex Blekhman    翻译:朱金灿   原文来源: http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx 译文来源:http://blog.csdn.net/clever101     C++语言毕竟能和Windows DLLs能够和平共处.     介绍          自从Windows的开始阶段动态链接库(DLL)就是Windows平台的一个组成部分.动态链接库允许在一个独立的模块中封装一系列

dll和ocx的区别

ActiveX,OLE是基于COM的一种应用,其文件后缀一般以dll和ocx结尾:ocx作为一种特殊的dll文件,具有一定的用户界面和事件响应,而dll文件只是方法和属性的集合. 一.关于DLL的介绍     DLL,动态链接库,Dynamic Link Library的缩写,是一个包含函数和数据的模块集合,可以被其它应用程序共享的程序模块.DLL作为共享函数库的可执行文件,封装了一个或多个已被编译.链接的函数.多个进程可以同时使用一个 DLL,在内存中共享该 DLL 的一个副本.DLL 还有助

JScript教程:使用JScript创建.exe或.dll文件

文章简介:JScript 是由微软开发的活动脚本语言,基于 ECMAScript 规范实现.Internet Explorer 中的 JavaScript,实际上是指 JScript.JScript 已被 Windows Script Host(WSH)支持.JScript 最新的版本(JScript.NET)基于尚未定稿的 ECMAScript 4.0 ,并且可以在.Net环境下编 什么是 JScript? JScript 是由微软开发的活动脚本语言,基于 ECMAScript 规范实现.In

使用LIBCTINY.LIB为EXE和DLL文件减肥

在 October 1996 column 我讨论过一个有关可执行文件大小的问题.那个时候,一个简单的 hello world 程序大约有32KB.在 Visual C++ 编译器更新了两个版本后,文件尺寸问题稍微得到了改善,同样的程序使用 Visual C++ 6.0 编译器现在只有28KB.在那时的专栏里,我使用了一个小的运行库来创建极小的可执行程序.虽然有不少局限,但是对决大多数的程序来说,它们运转得很好.这些局限已经存在相当长的一段时间了,我决心修正它们.同时也提供一个学习如何进一步减少

如何在Dll中导出STL类

简介:本文详述在DLL中导出stl类及包含stl的类的方法.例子源码 Dll无法直接导出泛型模板(generalized template),因此,如果要导出stl类,则模板必须先实例化(instantiated).另外,如果导出的STL类使用了其他STL类,那么这些其他类必须同时被导出.目前stl中唯一能够被导出的容器是vector,其他容器(如map.set.queue.list.deque)都因包含嵌套类而不能被导出. 导出STL类的步骤: 在Dll和exe文件中,用同样版本的c运行库链接

visual studio-有关DLL中申请的内存在外部释放的问题。

问题描述 有关DLL中申请的内存在外部释放的问题. 具体情况是这样的,我有应用程序,调用了一个DLL.在DLL中有一个函数,返回一个字符串指针,使用完了之后在应用程序中释放这个字符串指针. 在应用程序和DLL用同一个版本的VS编译的时候,调用是没有问题的. 当我用VS2010编译的应用程序去调用用VS2013编译的DLL时,在释放这个指针的时候应用程序就崩溃了. 有大婶知道这是怎么回事吗? 解决方案 关于在dll中申请内存,外部释放的问题关于在dll中申请内存,外部释放的问题Dll中开辟内存在外

delphi-Delphi中,怎么获取DLL中定义的变量

问题描述 Delphi中,怎么获取DLL中定义的变量 可以使用动态加载或静态加载的方式使用DLL中的方法,但是怎么能够获取DLL中定义的变量来使用它呢? 解决方案 要明确2个概念: 1.Dll是EXE的一个变种形态.它是可执行的. 2.Dll虽然由EXE调用,但执行读入内存后,Dll与EXE分别是独立的内存区域,相互不联系的.二者的数据(变量等)不能传递的. 为了能让Dll是EXE通联,往往可以通过以下几种方式建立联系. 1.发消息,它是单相思,消息发出后,对方知道否,接受了吗,不得而知. 2.

DLL中传递STL参数

以下是自己在调测代码过程出现问题后,搜索出来的资料,虽然很乱,但明白了在跨DLL传递stl中的容器类对象时存在问题的原因及解决办法,故保存之. STL跨平台调用会出现很多异常,你可以试试. STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下面是详细解释. 原因分析: 一句话-----如果任何STL类使用了静态变量(无论是直接还是间接使用),那么就不要再写出跨执行单元访问它的代码. 除非你能够确