以下的代码在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"));
这才是上好的解决之道
分享到:
相关推荐
要从EXE或DLL中提取图标,我们主要依赖Windows API函数,如`FindResource`、`LoadResource`、`LockResource`和`FreeResource`。下面是一个简单的步骤概述: 1. **打开资源**:使用`LoadLibraryEx`或`LoadLibrary`...
标题提到的"合并DLL把DLL作为exe资源合并到EXE中",是一种将DLL文件嵌入到可执行文件(EXE)中的技术,这种做法可以方便分发和部署,避免因丢失或版本不匹配的DLL文件导致的运行错误。本文将详细介绍这一过程,并...
在C++中,可以使用`FindResource`、`LoadResource`和`LockResource`函数来找到、加载和锁定资源,然后使用`VirtualAlloc`和`CopyMemory`创建一个新的内存区域,将DLL数据复制过来。最后,使用`VirtualProtect`更改...
在DLL代码中,我们使用API函数如`FindResource`、`LoadResource`和`LockResource`来获取并解包资源,然后`CreateProcess`来启动新进程执行`notepad.exe`。 以下是一个简单的步骤概述: 1. **创建DLL项目**:使用...
在IT领域,开发人员经常需要处理各种文件类型,如.exe(可执行文件)和.dll(动态链接库)文件。这些文件通常包含图标资源,用于在操作系统中显示应用程序的图形表示。本篇将深入探讨如何从.exe和.dll文件中提取和...
在Windows操作系统中,EXE(可执行文件)和DLL(动态链接库)是两种常见的程序模块。EXE文件是主程序,而DLL文件则包含了可重用的代码和数据,可以被多个EXE文件共享,以节省内存和磁盘空间。在某些情况下,开发者...
在DLL(动态链接库)中释放EXE是一个高级的编程技术,主要涉及到进程间通信、内存管理和资源操作等概念。这种技术通常用于某些特定场景,比如动态更新应用程序、注入代码或者实现某些隐蔽功能。下面将详细阐述这个...
在C编程中,我们可以使用Windows API函数,如`FindResource`、`LoadResource`和`LockResource`来读取资源,`WriteFile`或`VirtualAllocEx`来写入磁盘。在程序启动时,我们可以检测特定目录是否存在DLL,如果不存在,...
2. **查找图标资源**:使用FindResource和EnumResourceNames函数来遍历和识别文件中的图标资源。这些函数允许我们指定资源类型(如RT_ICON)并获取对应的资源名称。 3. **加载图标资源**:使用LoadImage函数,传入...
可以使用API如`FindResource`、`LoadResource`、`LockResource`和`FreeResource`来操作资源,并在运行时解压到内存中使用。 5. **注意事项**: - **版权问题**:确保有合法权利使用和修改DLL。 - **兼容性**:...
在Windows编程中,经常需要处理动态链接库(DLL)与可执行文件(EXE)之间的交互。有时为了简化部署过程或减少依赖,开发者会选择将DLL直接嵌入到EXE文件内部。本文将深入探讨如何实现这一过程,包括相关原理、步骤...
在Windows操作系统中,EXE和DLL文件包含了关于程序的各种元数据,如版本信息、产品名称、版权信息等。这些信息对于软件的管理和更新至关重要。在编程过程中,有时我们需要修改这些元数据,例如为了定制品牌或者更新...
在IT行业中,动态链接库(DLL)和可执行文件(EXE)是程序开发中常见的组件。DLLs允许代码重用,减少内存占用,并优化应用程序性能。本话题将深入探讨如何在二进制DLL或EXE中读取资源,特别是通过示例代码解析如何...
要从`.dll`或`.exe`中获取资源,我们需要使用Windows API函数,如`FindResource()`、`LoadResource()`和`LockResource()`。这些函数帮助我们定位、加载和锁定资源,以便我们能够处理它们。`FindResource()`用于找到...
6. **第三方工具**:除了编程实现外,也有许多现成的第三方工具,如ResHacker、Resource Hacker等,可以方便地查看和提取DLL、EXE等文件中的资源,包括图标。 7. **版权问题**:在提取和使用图标时,必须注意版权...
在描述中提到的VB程序“ExtIcon”,可能是用于提取DLL、EXE和资源文件中图标的一个工具。它可能包含了以下关键步骤: 1. **加载资源**:使用API函数LoadLibrary或LoadResource加载目标文件,获取资源句柄。 2. **...
在Windows操作系统中,有时为了软件的安全性和便携性,开发者会尝试将可执行文件(exe)嵌入到主程序的资源中,然后在程序运行时动态地从资源中加载到内存并执行。这种方式避免了单独分发多个文件,也可以防止恶意...
在C++中,通过WinAPI函数如`FindResource`、`LoadResource`、`LockResource`和`FreeResource`等可以访问和修改这些资源。"UpdateVersion"源码可能包含了这样的函数调用来读取和更新版本信息。 **6. 版本信息的重要...
在C++中,可以使用`LoadLibrary`函数加载DLL,`FindResource`和`LoadResource`函数查找并加载资源,最后使用`LockResource`和`UnlockResource`来锁定和解锁资源,以便进行读取操作。例如,如果要获取一个位图资源,...
`LoadLibrary`用于加载DLL,`FindResource`则用于在指定的模块(可能是EXE或DLL)中寻找特定类型的资源。 接下来,我们分析为何需要进行资源模块切换。资源模块切换通常发生在应用程序需要使用不同版本或不同语言的...