C++释放dll资源

思路:①加载dll到工程中,②使用函数查找资源,③创建文件,④写入资源。

C++内存分类:
    在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

   栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

    堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

  自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

  全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

  常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

本实例在vc++6

1、创建工程。(win32应用程序)

C++释放dll资源_第1张图片

C++释放dll资源_第2张图片

2 、创建完程后开始添加资源。

C++释放dll资源_第3张图片

C++释放dll资源_第4张图片

C++释放dll资源_第5张图片

3、保存导入的资源C++释放dll资源_第6张图片

4、增加刚才的资源到工程:

C++释放dll资源_第7张图片 C++释放dll资源_第8张图片

5、编译后,使用lodepe查看:

C++释放dll资源_第9张图片 C++释放dll资源_第10张图片

6、增加代码,释放这个DLL。

#include "stdafx.h"
#include "Resource.h"
bool CreateMyFile(char* strFilePath,LPBYTE lpBuffer,DWORD dwSize)
{
	DWORD dwWritten;
	
	HANDLE hFile = CreateFile(strFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
	if (hFile != NULL)
	{
		WriteFile(hFile, (LPCVOID)lpBuffer, dwSize, &dwWritten, NULL);
	}
	else
	{
		return false;
	}
	CloseHandle(hFile);
	return true;
}
                //要释放的路径   资源ID            资源名
bool CreateEXE(char* strFilePath,int nResourceID,char* strResourceName)
{
	HRSRC hResInfo;
	HGLOBAL hResData;
	DWORD dwSize;
	LPBYTE p;
	// 查找所需的资源
	hResInfo = FindResource(NULL, MAKEINTRESOURCE(nResourceID), strResourceName);
	if (hResInfo == NULL)
	{
		//MessageBox(NULL, "查找资源失败!", "错误", MB_OK | MB_ICONINFORMATION);
		return false;
	}
	// 获得资源尺寸
	dwSize = SizeofResource(NULL, hResInfo);
	// 装载资源
	hResData = LoadResource(NULL, hResInfo);
	if (hResData == NULL)
	{
		//MessageBox(NULL, "装载资源失败!", "错误", MB_OK | MB_ICONINFORMATION);
		return false;
	}
	// 为数据分配空间
	p = (LPBYTE)GlobalAlloc(GPTR, dwSize);
	if (p == NULL)
	{
		//MessageBox(NULL, "分配内存失败!", "错误", MB_OK | MB_ICONINFORMATION);
		return false;
	}
	// 复制资源数据
	CopyMemory((LPVOID)p, (LPCVOID)LockResource(hResData), dwSize);	
	
	bool bRet = CreateMyFile(strFilePath,p,dwSize);
	if(!bRet)
	{
		GlobalFree((HGLOBAL)p);
		return false;
	}
	
	GlobalFree((HGLOBAL)p);
	
	return true;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	CreateEXE("C:\\XXX.dll",IDR_DLL,"DLL");
	return 0;
}

7、编译后运行:(因为dll是放在C盘,所有如果运行没有释放,请使用管理员权限)

C++释放dll资源_第11张图片

你可能感兴趣的:(C/C++)