`
testcs_dn
  • 浏览: 114553 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

在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;
}



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"));

这才是上好的解决之道

分享到:
评论

相关推荐

    visual c++用代码 提取EXE或DLL中的图标ico

    要从EXE或DLL中提取图标,我们主要依赖Windows API函数,如`FindResource`、`LoadResource`、`LockResource`和`FreeResource`。下面是一个简单的步骤概述: 1. **打开资源**:使用`LoadLibraryEx`或`LoadLibrary`...

    合并DLL把DLL作为exe资源合并到EXE中

    标题提到的"合并DLL把DLL作为exe资源合并到EXE中",是一种将DLL文件嵌入到可执行文件(EXE)中的技术,这种做法可以方便分发和部署,避免因丢失或版本不匹配的DLL文件导致的运行错误。本文将详细介绍这一过程,并...

    合并 DLL至EXE资源文件调用

    在C++中,可以使用`FindResource`、`LoadResource`和`LockResource`函数来找到、加载和锁定资源,然后使用`VirtualAlloc`和`CopyMemory`创建一个新的内存区域,将DLL数据复制过来。最后,使用`VirtualProtect`更改...

    Dll中封装Exe并运行Exe

    在DLL代码中,我们使用API函数如`FindResource`、`LoadResource`和`LockResource`来获取并解包资源,然后`CreateProcess`来启动新进程执行`notepad.exe`。 以下是一个简单的步骤概述: 1. **创建DLL项目**:使用...

    一个从exe、dll文件中提取、存取图标完整程序.rar_delphi dll_delphi dll图标_exe 提取图标_从E

    在IT领域,开发人员经常需要处理各种文件类型,如.exe(可执行文件)和.dll(动态链接库)文件。这些文件通常包含图标资源,用于在操作系统中显示应用程序的图形表示。本篇将深入探讨如何从.exe和.dll文件中提取和...

    exe文件中释放DLL等资源的程序

    在Windows操作系统中,EXE(可执行文件)和DLL(动态链接库)是两种常见的程序模块。EXE文件是主程序,而DLL文件则包含了可重用的代码和数据,可以被多个EXE文件共享,以节省内存和磁盘空间。在某些情况下,开发者...

    在dll中释放exe

    在DLL(动态链接库)中释放EXE是一个高级的编程技术,主要涉及到进程间通信、内存管理和资源操作等概念。这种技术通常用于某些特定场景,比如动态更新应用程序、注入代码或者实现某些隐蔽功能。下面将详细阐述这个...

    将Dll整合到exe源码

    在C编程中,我们可以使用Windows API函数,如`FindResource`、`LoadResource`和`LockResource`来读取资源,`WriteFile`或`VirtualAllocEx`来写入磁盘。在程序启动时,我们可以检测特定目录是否存在DLL,如果不存在,...

    从EXE .DLL中提取图标

    2. **查找图标资源**:使用FindResource和EnumResourceNames函数来遍历和识别文件中的图标资源。这些函数允许我们指定资源类型(如RT_ICON)并获取对应的资源名称。 3. **加载图标资源**:使用LoadImage函数,传入...

    把dll合并到exe文件c++源码

    可以使用API如`FindResource`、`LoadResource`、`LockResource`和`FreeResource`来操作资源,并在运行时解压到内存中使用。 5. **注意事项**: - **版权问题**:确保有合法权利使用和修改DLL。 - **兼容性**:...

    将dll打包入exe

    在Windows编程中,经常需要处理动态链接库(DLL)与可执行文件(EXE)之间的交互。有时为了简化部署过程或减少依赖,开发者会选择将DLL直接嵌入到EXE文件内部。本文将深入探讨如何实现这一过程,包括相关原理、步骤...

    exe,dll版本,名称信息修改代码

    在Windows操作系统中,EXE和DLL文件包含了关于程序的各种元数据,如版本信息、产品名称、版权信息等。这些信息对于软件的管理和更新至关重要。在编程过程中,有时我们需要修改这些元数据,例如为了定制品牌或者更新...

    二进制DLL(或EXE)中读取资源ResFile.zip_dll_dll读取_exe

    在IT行业中,动态链接库(DLL)和可执行文件(EXE)是程序开发中常见的组件。DLLs允许代码重用,减少内存占用,并优化应用程序性能。本话题将深入探讨如何在二进制DLL或EXE中读取资源,特别是通过示例代码解析如何...

    获取dll,exe 中的资源图片源代码

    要从`.dll`或`.exe`中获取资源,我们需要使用Windows API函数,如`FindResource()`、`LoadResource()`和`LockResource()`。这些函数帮助我们定位、加载和锁定资源,以便我们能够处理它们。`FindResource()`用于找到...

    程序图标提取器(从dll中提取图标)

    6. **第三方工具**:除了编程实现外,也有许多现成的第三方工具,如ResHacker、Resource Hacker等,可以方便地查看和提取DLL、EXE等文件中的资源,包括图标。 7. **版权问题**:在提取和使用图标时,必须注意版权...

    从 DLL、EXE 或资源文件中解开 ICON(3KB).zip_dll_dll资源文件_exe_icon_vb dll

    在描述中提到的VB程序“ExtIcon”,可能是用于提取DLL、EXE和资源文件中图标的一个工具。它可能包含了以下关键步骤: 1. **加载资源**:使用API函数LoadLibrary或LoadResource加载目标文件,获取资源句柄。 2. **...

    实现exe从资源中加载到内存中运行

    在Windows操作系统中,有时为了软件的安全性和便携性,开发者会尝试将可执行文件(exe)嵌入到主程序的资源中,然后在程序运行时动态地从资源中加载到内存并执行。这种方式避免了单独分发多个文件,也可以防止恶意...

    UpdateVersion 修改exe,dll文件版本源码

    在C++中,通过WinAPI函数如`FindResource`、`LoadResource`、`LockResource`和`FreeResource`等可以访问和修改这些资源。"UpdateVersion"源码可能包含了这样的函数调用来读取和更新版本信息。 **6. 版本信息的重要...

    纯资源DLL(加载和调用)

    在C++中,可以使用`LoadLibrary`函数加载DLL,`FindResource`和`LoadResource`函数查找并加载资源,最后使用`LockResource`和`UnlockResource`来锁定和解锁资源,以便进行读取操作。例如,如果要获取一个位图资源,...

    dll资源模块切换问题的分析

    `LoadLibrary`用于加载DLL,`FindResource`则用于在指定的模块(可能是EXE或DLL)中寻找特定类型的资源。 接下来,我们分析为何需要进行资源模块切换。资源模块切换通常发生在应用程序需要使用不同版本或不同语言的...

Global site tag (gtag.js) - Google Analytics