文章目录
- 1.MAKEINTRESOURCE宏-数字转字符串指针
- 2.FindResource-查找资源
- 3.SizeofResource-获取资源大小
- 4.LoadResource-加载资源到全局存储器
- 5.LockResource-锁定资源并返回内存指针
- 6.范例-将自定义资源文件保存到文件
- 7.总结
在静态编译的程序中,将自定义资源文件打包到exe或者dll,可以避免程序在分发时,丢失资源文件,这在一些小而优的程序中是十分友好的,本文介绍在VS中,如何将资源文件打包。
1.MAKEINTRESOURCE宏-数字转字符串指针
MAKEINTRESOURCE是一个资源名转换的宏,这个宏是把一个数字类型转换成指针类型的宏,它不存在释放的问题。
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
#ifdef UNICODE
#define MAKEINTRESOURCE MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE MAKEINTRESOURCEA
#endif // !UNICODE
2.FindResource-查找资源
该函数确定指定模块中指定类型和名称的资源所在位置。
HRSRC
WINAPI
FindResourceW(
_In_opt_ HMODULE hModule,//处理包含资源的可执行文件的模块。
_In_ LPCWSTR lpName,//指定资源名称。
_In_ LPCWSTR lpType//指定资源类型。
);
#ifdef UNICODE
#define FindResource FindResourceW
#endif
如果函数运行成功,那么返回值为指向被指定资源信息块的句柄。为了获得这些资源,将这个句柄传递给LoadResource函数。如果函数运行失败,则返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。
3.SizeofResource-获取资源大小
该函数返回指定资源的字节数大小。
4.LoadResource-加载资源到全局存储器
装载指定资源到全局存储器。
5.LockResource-锁定资源并返回内存指针
锁定资源并得到资源在内存中的第一个字节的指针。
6.范例-将自定义资源文件保存到文件
头文件
#pragma once
//将自定义资源保存到文件
class ZLWin32CustomResource
{
public:
static bool WriteResource2File(const char* dstFilename, const wchar_t* resID, const wchar_t* resType);
};
实现文件
#include "ZLWin32CustomResource.h"
#include "windows.h"
#include <stdio.h>
bool ZLWin32CustomResource::WriteResource2File(const char* dstFilename, const wchar_t* resID, const wchar_t* resType) {
//定位我们的自定义资源,这里因为我们是从本模块定位资源,所以将句柄简单地置为NULL即可
HRSRC hRsrc = FindResourceW(NULL, resID, resType);
if (NULL == hRsrc)
return false;
//获取资源的大小
DWORD dwSize = SizeofResource(NULL, hRsrc);
if (0 == dwSize)
return false;
//加载资源
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
if (NULL == hGlobal)
return false;
//锁定资源
LPVOID pBuffer = LockResource(hGlobal);
if (NULL == pBuffer)
return false;
//我们用刚才得到的pBuffer和dwSize来做一些需要的事情。可以直接在内存中使
//用,也可以写入到硬盘文件。这里我们简单的写入到硬盘文件,如果我们的自定
//义资源是作为嵌入DLL来应用,情况可能要复杂一些。
bool bRt = false;
FILE* fp = fopen(dstFilename, "wb");
if (fp != NULL)
{
if (dwSize == fwrite(pBuffer, sizeof(char), dwSize, fp))
bRt = true;
fclose(fp);
}
FreeResource(hGlobal);
return bRt;
}
7.总结
自定义资源文件,方便携带使用,可以从内存直接使用,也可以转为文件,再次使用。