c++ 釋放資源

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章