DLL 延迟加载与资源释放

DLL延迟加载与资源释放延迟加载DLL的延迟加载技术,使用延迟加载方式编译连接可执行文件。这样可执行文件可以先加载执行,而依赖的dll文件会在正式调用的时候被加载进来。好处是可以把必须使用的D

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

DLL 延迟加载与资源释放

延迟加载

DLL的延迟加载技术,使用延迟加载方式编译连接可执行文件。这样可执行文件可以先加载执行,而依赖的dll文件会在正式调用的时候被加载进来。

好处是可以把必须使用的DLL文件以资源方式插入到程序中并且使用延迟加载。在程序运行时把DLL文件释放到本地,然后进行加载。这样exe并不需要依附DLL文件。并且不会担心DLL丢失。

延迟加载实现

延迟加载并不需要代码来实现,只需要对VS链接属性进行设置即可

属性—>链接器—>输入—>延迟加载的DLL—>输入:dll名称

 DLL 延迟加载与资源释放

DLL延迟加载技术的原理,其实就是在导入表中去掉我们想要隐藏的DLL这一项,等到DLL被正式调用的时候,才会加载DLL文件。这样,程序在正式调用DLL之前,都是可以正常执行的。

资源释放

#include <iostream>
#include <iostream>
#include<windows.h>
#include "resource.h"

BOOL FreeMyResource(UINT uiResouceName, char* lpszResourceType, char* lpszSaveFileName);

void GetCurrentPath(char* lpszCurrentPath, DWORD dwSize);

void FreeRes_ShowError(char* pszText);

// CDelayLoadDll_TestDlg 消息处理程序


void FreeRes_ShowError(char* pszText)
{
	char szErr[MAX_PATH] = { 0 };
	::wsprintf(szErr, "%s Error[%d]\n", pszText, ::GetLastError());
	::MessageBox(NULL, szErr, "ERROR", MB_OK);
}

// 释放资源
BOOL FreeMyResource(UINT uiResouceName, char* lpszResourceType, char* lpszSaveFileName)
{
	HRSRC hRsrc = ::FindResource(NULL, MAKEINTRESOURCE(uiResouceName), lpszResourceType);
	if (NULL == hRsrc)
	{
		FreeRes_ShowError("FindResource");
		return FALSE;
	}
	DWORD dwSize = ::SizeofResource(NULL, hRsrc);
	if (0 >= dwSize)
	{
		FreeRes_ShowError("SizeofResource");
		return FALSE;
	}
	HGLOBAL hGlobal = ::LoadResource(NULL, hRsrc);
	if (NULL == hGlobal)
	{
		FreeRes_ShowError("LoadResource");
		return FALSE;
	}
	LPVOID lpVoid = ::LockResource(hGlobal);
	if (NULL == lpVoid)
	{
		FreeRes_ShowError("LockResource");
		return FALSE;
	}

	FILE* fp = NULL;
	fopen_s(&fp, lpszSaveFileName, "wb+");
	if (NULL == fp)
	{
		FreeRes_ShowError("LockResource");
		return FALSE;
	}
	fwrite(lpVoid, sizeof(char), dwSize, fp);
	fclose(fp);

	return TRUE;
}


// 获取当前目录
void GetCurrentPath(char* lpszCurrentPath, DWORD dwSize)
{
	::GetModuleFileName(NULL, lpszCurrentPath, dwSize);
	char* p = ::strrchr(lpszCurrentPath, '\\');
	p[0] = '\0';
}

int main()
{
	typedef int (*_pHello)(int a,int b);
	
	// 释放DLL
// 获取当前目录
	char szCurrentPath[MAX_PATH] = { 0 };
	GetCurrentPath(szCurrentPath, MAX_PATH);
	// 构造路径
	::lstrcat(szCurrentPath, "\\hello_world.dll");
	FreeMyResource(IDR_TEST1, "test", szCurrentPath);
	HINSTANCE hDll = LoadLibrary("hello_world.dll");
	_pHello hello = (_pHello)GetProcAddress(hDll, "add");
	int nHello = hello(1,2);
	std::cout << nHello << std::endl;

 DLL 延迟加载与资源释放

查看导入表

 DLL 延迟加载与资源释放

但可以根据PE结构中的资源表IMAGE_RESOURCE_DIRECTORY来解析PE中的所有资源,获取资源的偏移地址和数据大小。

 DLL 延迟加载与资源释放

Tips

  1. 关于如果Visual Studio 2019 出现const char *“ 类型的实参与 “LPCWSTR“ 类型的形参不兼容这类错误。需要修改字符集
  2. 关于如果Visual Studio 2019 出现4996类错误。右击项目文件 — 单击属性 — 配置属性 — c/c++ — 语言 — 符合模式修改符合模式为否。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119851.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MATLAB读取nc文件_如何转换mp3文件格式

    MATLAB读取nc文件_如何转换mp3文件格式因为课题处理30年的降雨和蒸发的遥感资料(.NC格式),而想要在Arcgis中处理要求的是raster格式的,所以需要批量转化为tif文件,所以在此分享自己改编之后的代码,可以简洁明了的实现这个过程:版本:MATLAB_2018bclc;clear;%%批读取NC文件的准备工作datadir=’G:\Global_P_ET\MSWEP_V2.2\’;%指定批量数据所在的文件夹…

    2025年8月12日
    2
  • 程序猿面试什么最重要?[通俗易懂]

    程序猿面试什么最重要?

    2022年2月1日
    44
  • C语言优先级顺序表口诀「建议收藏」

    C语言优先级顺序表口诀「建议收藏」一是括号结构体,二是单目运算符,三乘除余四加减;五左右移六大小,七是等于不等于,与异或或位在前;三目赋值与逗号。

    2022年6月16日
    39
  • 大话数据结构PDF

    大话数据结构PDF《大话数据结构》相关下载地址重难点目录下载地址云盘:touchhere.提取码:93dc重难点目录第一章绪论逻辑结构,物理存储结构(顺序和链式)数据结构类型第二章算法时间复杂度和空间复杂度,计算方法最坏情况、平均情况。第三章链表动态链表:指针,常用静态链表:数组,无指针语言(Basic)使用,较少用 循环链表:(单循环)next双向链表:next,prior 双向循环链表,插入时候的指针改动,顺序非常重要。–》第四章

    2022年6月24日
    29
  • pip更新方法

    pip更新方法pip更新方法如下:方法一:pycharm中的Terminal中更新,使用如下命令:python-mpipinstall–upgradepip方法二:删除原pip文件,重新安装例如pip文件在如下文件夹中C:\Python\Python373\Lib\site-packages我们能够知道pip20.1.1所在路径,找到它,然后删掉pip-20.1.1.dist-info文件夹。设置如下图,已不见pip的踪影。提示,packagi…

    2022年6月11日
    174
  • 灰色关联度模型matlab_灰色关联分析法的适用范围

    灰色关联度模型matlab_灰色关联分析法的适用范围matlab之灰色关联分析法https://blog.csdn.net/m0_37286282/article/details/79183333

    2025年7月24日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号