1、適合場景
有時候會想在A.exe釋放b.exe以供A.exe使用,這時候就會用到釋放資源這玩意~
2、涉及函數以及調用次序
2.1 查找資源:FindResource
2.2 加載資源:LoadResource
2.3 鎖住資源:LockResource
2.4 獲取資源大小:SizeofResource
2.5 創建文件:CreateFile
2.6 將資源寫到文件中:WriteFile
PS:在調用函數之前,還要將資源放到A.exe代碼目錄中,並做如下操作:
1)在該工程的ResourceFiles右鍵添加資源
2)接着會出現如下界面,然後點擊導入
3)接着會出現如下界面,然後加入你想加入的文件
接着出現如下界面:
4)最後,在代碼里加入頭文件:#include "resource.h"
3、代碼示例
#include "stdafx.h"
#include "resource.h"
int _tmain(int argc, _TCHAR* argv[])
{
// IDR_TESTEXE1是新增資源在resource.h中定義的資源ID號
HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_TESTEXE1), L"PNG");
if (hResInfo == NULL)
{
DWORD dwError = GetLastError();
return -1;
}
// 加載資源
HGLOBAL hResData = LoadResource(NULL, hResInfo);
// 鎖住資源
LPVOID pvResData = LockResource(hResData);
// 獲取資源大小
DWORD dwResSize = SizeofResource(NULL, hResInfo);
// 創建文件
HANDLE hFile = CreateFile(L"D:\\test\\test.png", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL, CREATE_ALWAYS, FILE_SHARE_READ, NULL);
// 寫文件
DWORD dwWritten = 0;
WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
CloseHandle(hFile);
FreeResource(hResData);
return 0;
}
下面這個感覺有點好玩,還可以加載b.exe裏面的資源
#include "stdafx.h"
#include "resource.h"
// 得先知道該資源在test.exe的resource.h中的定義
#define IDB_PNG_BG 204
int _tmain(int argc, _TCHAR* argv[])
{
// res\\test.exe是放到A.exe代碼目錄下
HMODULE hLib = LoadLibrary(L"res\\test.exe");
// 查找hLib的資源,hLib爲空則爲查找該exe中的資源
HRSRC hResInfo = FindResource(hLib, MAKEINTRESOURCE(IDB_PNG_BG), L"PNG");
if (hResInfo == NULL)
{
DWORD dwError = GetLastError();
return -1;
}
// 加載資源
HGLOBAL hResData = LoadResource(hLib, hResInfo);
// 鎖住資源
LPVOID pvResData = LockResource(hResData);
// 獲取資源大小
DWORD dwResSize = SizeofResource(hLib, hResInfo);
// 創建文件
HANDLE hFile = CreateFile(L"D:\\test\\test.png", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL, CREATE_ALWAYS, FILE_SHARE_READ, NULL);
// 寫文件
DWORD dwWritten = 0;
WriteFile(hFile, pvResData, dwResSize, &dwWritten, NULL);
CloseHandle(hFile);
FreeResource(hResData);
return 0;
}