通过资源释放相关 API,可以把一些必要的 dll、图片、音乐等文件以资源的形式存放到 exe 中,当 exe 运行的时候进行释放;在文件传输方面会比较方便,因为可以一个 exe 装一堆东西。
API 介绍
API:FindResource
获取指定模块的资源,返回资源句柄
HRSRC
WINAPI
FindResourceW(
_In_opt_ HMODULE hModule,//资源所在模块句柄,如果是当前模块,则NULL就行
_In_ LPCWSTR lpName,//资源名称:MAKEINTRESOURCE(ID)
_In_ LPCWSTR lpType//资源类型
);
API:SizeofResource
获取资源的大小
DWORD
WINAPI
SizeofResource(
_In_opt_ HMODULE hModule,//模块句柄,当前模块就NULL
_In_ HRSRC hResInfo//资源句柄
);
API:LoadResource
加载资源到全局存储器,返回指向资源文件首地址的指针(资源数据句柄)
HGLOBAL
WINAPI
LoadResource(
_In_opt_ HMODULE hModule, //模块句柄
_In_ HRSRC hResInfo //资源句柄
);
API:LockResource
锁定内存中的资源,返回指向资源文件首地址的指针
LPVOID
WINAPI
LockResource(
_In_ HGLOBAL hResData //资源数据句柄
);
这里以释放 DLL 文件并调用 DLL 内的函数为例,演示资源释放的过程
示例代码
这里的环境是 VS2019,记得先右键项目,添加,资源,导入
// 功能:释放指定的资源到指定路径
// 参数:资源名称,资源类型,保存路径
BOOL FreeMyResoure(UINT uiResourceName, wchar_t* lpszResourceType, char* lpszSaveFileName) {
//获取指定模块里的资源
HRSRC hRsrc = ::FindResource(NULL, MAKEINTRESOURCE(uiResourceName), lpszResourceType);
//获取资源大学
DWORD dwSize = ::SizeofResource(NULL, hRsrc);
//加载资源到内存
HGLOBAL hGlobal = ::LoadResource(NULL, hRsrc);
//锁定资源
LPVOID lpVoid = ::LockResource(hGlobal);
//保存资源为文件
FILE* fp = NULL;
fopen_s(&fp,lpszSaveFileName,"wb+");
fwrite(lpVoid, sizeof(char), dwSize, fp);
fclose(fp);
// 也可以使用Windows API的方式来写出文件
// 创建文件,获得文件句柄,进行写出
//HANDLE hFile = CreateFileA(lpFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// 写文件
//DWORD dwWriteSize = 0;
//WriteFile(hFile, lpRes, dwSize, &dwWriteSize, NULL);
//CloseHandle(hFile);
CloseHandle(hGlobal);
return TRUE;
}
参考资料
- 《Windows 黑客编程技术详解》