动态释放资源文件
一、动态释放资源文件
1 添加资源文件
新建项目后,转到资源视图
,然后 右键空白处 -> 添加资源 -> 导入 -> 选择需要添加的资源文件(如 exe、dll 等)-> 然后添加自定义类型(如 Binary
,自定义类型名会自动转为字符串,后面要用到) -> 修改 ID
(如 "IDR_DATA"
,必须加双引号,将其手动变为字符串类型,否则是一个数值,后面要用到) -> 修改 外部文件
为 False
(将资源文件整合到 exe
中):
2 在代码中释放资源文件
bool ReleaseResource(const std::wstring& resource_name, const std::wstring& resource_type,
const std::wstring& output_path)
{
// 获取当前模块句柄
HMODULE hMod = GetModuleHandle(NULL);
if (!hMod)
return false;
// 打开资源
HRSRC hResource = FindResourceW(hMod, resource_name.c_str(), resource_type.c_str());
if (!hResource)
return false;
// 加载资源
HGLOBAL hLoadedResource = LoadResource(hMod, hResource);
if (!hLoadedResource)
return false;
// 锁定资源
void* pResourceData = LockResource(hLoadedResource);
if (!pResourceData)
return false;
// 获取资源大小
DWORD dwResourceSize = SizeofResource(hMod, hResource);
if (!dwResourceSize)
return false;
// 打开输出文件
std::ofstream outFile(output_path, std::ios::binary);
if (!outFile)
return false;
// 写入资源数据到文件
outFile.write(static_cast<char*>(pResourceData), dwResourceSize);
if (!outFile)
return false;
outFile.close();
return true;
}
注:
resource_name
:"IDR_DATA",resource_type
:"Binary",资源ID
加上双引号后就是字符串了,调用 FindResource 函数时 ID 参数可以传入字符串,否则资源ID
没加双引号就是一个数值,我们传入字符串用 FindResource 函数寻找资源时,会提示无法找到该资源。