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++ — 语言 — 符合模式修改符合模式为否。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • response.setcontenttype详解

    response.setcontenttype详解Response.setContentType(MIME)的作用是时客户端的浏览器区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。MIME的作用:由于MIME类型与文档的后缀相关,因此服务器使用文档的后缀来区分不同文件的MIME类型,服务器中必须定义文档后缀和MIME类型之间的对应关系。而客户程序从服务器上接收数据的时候,它只是从服务…

  • ubuntu域名服务器配置_linux虚拟主机配置

    ubuntu域名服务器配置_linux虚拟主机配置像我一样刚开始接触Ubuntu系统朋友不知道怎么配置虚拟主机的可以看一下,这里完整记录了我配置虚拟主机的全部过程

  • CTFshow——SSTI

    CTFshow——SSTI首先一定要了解有关python类的知识:python__base__等内置方法pythoninspect模块解析#coding=utf-8__author__=”leaves”classBase(object):a=0def__init__(self):self._a=10passclassChild(Base):”测试测试”_b=10def__str__(

    2022年10月20日
  • CNN笔记:通俗理解卷积神经网络

    CNN笔记:通俗理解卷积神经网络通俗理解卷积神经网络(cs231n与5月dl班课程笔记)1前言2012年我在北京组织过8期machinelearning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有一个词似乎比“机器学习”更火,那就是“深度学习”。本博客内写过一些机器学习相关的文章,但上一…

  • 没有理想,你和我还有什么区别呢![通俗易懂]

    阳光之中到处可见 奔忙的人们 被拥挤着 被一晃而飞的光阴 忽略过

  • Velocity 语法详解「建议收藏」

    Velocity 语法详解「建议收藏」Velocity是基于Java的模板引擎,它允许页面设计者引用Java中定义的方法。页面设计者和Java开发者能够同时使用MVC的模式开发网站,这样网页设计者能够把精力放在页面的设计上,程序员也可以把精力放在代码开发上。Velocity把Java代码从Web页面中分离,使网站可维护性更强,同时也在Java服务器页面(JSPs)或者PHP中提供了可视化交互的选择。Velocity可以被用在以…

发表回复

您的电子邮箱地址不会被公开。

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