# DLL延迟加载
# 背景
我们在开发程序的时候,通常会使用第三方库,但是并不是所有的第三方库都会提供静态库文件,而是提供动态库文件。这样,我们的程序就需要相应的DLL文件才能加载启动。
现在,我们想大家介绍一种DLL延迟加载技术,使用延迟加载方式编译链接可执行文件。这样,可执行程序就可以先加载执行,所依赖的DLL在正式调用时才被加载进来。
这样做的好处就是,我们可以把必需的DLL文件以资源的形式包含到我们的程序中,并使用DLL延迟加载技术延迟加载必需的DLL。这样,在正式调用必需的DLL之前,程序都是可以正常执行的,我们可以在程序运行的时候,就把在资源中的DLL释放到本地,所以,程序所有功能就可以正常执行了。我们只需把EXE文件发送给用户,而不需要附加DLL文件了,也不需要担心程序会丢失DLL文件。
# 实现原理
## DLL延迟加载原理
本程序以加载第三方库——skin++库为例子进行讲解演示。我们在导入库文件,编码完成后,对程序编译链接等到可执行文件。我们使用PEview.exe查看可执行文件的导入表,就可知道可执行文件所必需的DLL文件。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/0047af15008122c90aa2799e62998e89.writebug)
上面可以知道,导入表中有SkinPPWTL.dll文件,也就是说,程序加载运行的时候,SkinPPWTL.dll文件必需存在,否则程序不能正常加载启动。
DLL延迟加载技术的原理,其实就是在导入表中去掉SkinPPWTL.dll这一项,等到DLL被正式调用的时候,才会加载DLL文件。这样,程序在正式调用DLL之前,都是可以正常执行的。
## DLL延迟加载实现
DLL延迟加载的实现,并不需要任何编码,只需要设置下开发环境的链接选项即可。本程序使用的是VS2013开发环境,还是继续上述skin++皮肤库的例子进行讲解。DLL延迟加载实现的步骤为:
**属性-->链接器-->输入-->延迟加载的DLL-->输入:SkinPPWTL.dll**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/e7c28eb22cef3bb2fa2dad37ca561778.writebug)
这样,DLL延迟加载就完成了。这时,我们编译链接,再用PEview.exe查看可执行程序的导入表信息:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2b3d33448396fb4cdf305e885e69032f.writebug)
可见,导入表中没有SkinPPWTL.dll文件了。所以,程序在正式调用该DLL之前,程序都是可以加载执行的。
接下来,我们就把SkinPPWTL.dll作为资源导入,在加载皮肤之前就释放DLL到本地上,这样程序正常加载执行了。
# 编码实现
## 皮肤加载
```c++
// 加载界面皮肤
void LoadSkin()
{
// 加载皮肤
// 获取当前目录
char szCurrentPath[MAX_PATH] = { 0 };
GetCurrentPath(szCurrentPath, MAX_PATH);
// 构造路径
::lstrcat(szCurrentPath, "\\Skins\\");
::lstrcat(szCurrentPath, "dogmax2.ssk");
// 加载皮肤
::skinppLoadSkin(szCurrentPath);
}
```
## 资源释放
```c++
// 释放资源
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;
}
```
# 程序测试
我们直接运行EXE程序,程序正常执行,DLL成功释放,皮肤加载成功:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/35b8e1607742f22ddbf38ad31ea4da9a.writebug)
# 总结
该程序实现并不难,只是多了个设置链接选项。这样,程序就会更加简洁,而且方便易用。这算是程序开发的一个小技巧吧,希望能对大家有所帮助。
# 参考
参考自《[Windows黑客编程技术详解](https://www.write-bug.com/article/1811.html "Windows黑客编程技术详解")》一书
没有合适的资源?快使用搜索试试~ 我知道了~
精选_DLL延迟加载_源码打包
共124个文件
ssk:96个
h:7个
dll:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 102 浏览量
2022-03-06
18:00:11
上传
评论
收藏 14.12MB ZIP 举报
温馨提示
DLL延迟加载
资源推荐
资源详情
资源评论
收起资源包目录
精选_DLL延迟加载_源码打包 (124个子文件)
DelayLoadDll_Test.aps 592KB
DelayLoadDll_TestDlg.cpp 5KB
DelayLoadDll_Test.cpp 2KB
stdafx.cpp 142B
skinppwtl.dll 536KB
skinppwtl.dll 536KB
skinppwtl.dll 536KB
DelayLoadDll_Test.exe 9.51MB
DelayLoadDll_Test.vcxproj.filters 2KB
SkinPPWTL.h 6KB
SkinPPWTL.h 6KB
stdafx.h 1KB
resource.h 1KB
DelayLoadDll_TestDlg.h 661B
DelayLoadDll_Test.h 478B
targetver.h 226B
DelayLoadDll_Test.ico 66KB
demon64X64.ico 17KB
SkinPPWTL.lib 26KB
SkinPPWTL.lib 26KB
LICENSE 1KB
README.md 4KB
DelayLoadDll_Test.rc 12KB
DelayLoadDll_Test.rc2 690B
DelayLoadDll_Test.sln 975B
blue.ssk 998KB
blue.ssk 998KB
MAC.ssk 295KB
MAC.ssk 295KB
UMskin.ssk 280KB
UMskin.ssk 280KB
Christmas.ssk 229KB
Christmas.ssk 229KB
FauxS-TOON.ssk 175KB
FauxS-TOON.ssk 175KB
avfone.ssk 146KB
avfone.ssk 146KB
Longhorn.ssk 131KB
Longhorn.ssk 131KB
Steel.ssk 130KB
Steel.ssk 130KB
Longhorn Silver.ssk 123KB
Longhorn Silver.ssk 123KB
Noire.ssk 122KB
Noire.ssk 122KB
Gloss.ssk 119KB
Gloss.ssk 119KB
PurpleClass.ssk 119KB
PurpleClass.ssk 119KB
Longhorn5203.ssk 118KB
Longhorn5203.ssk 118KB
XP-Luna.ssk 113KB
XP-Luna.ssk 113KB
DameK UltraBlue.ssk 97KB
DameK UltraBlue.ssk 97KB
XP-Home.ssk 96KB
XP-Home.ssk 96KB
green.ssk 93KB
green.ssk 93KB
Aura.ssk 86KB
Aura.ssk 86KB
AquaOS.ssk 84KB
AquaOS.ssk 84KB
xp_corona.ssk 78KB
xp_corona.ssk 78KB
spring.ssk 78KB
spring.ssk 78KB
RisingDragon.ssk 78KB
RisingDragon.ssk 78KB
SlickOS2.ssk 77KB
SlickOS2.ssk 77KB
Mako.ssk 76KB
Mako.ssk 76KB
RedCopper.ssk 76KB
RedCopper.ssk 76KB
Royale.ssk 74KB
Royale.ssk 74KB
XP-Metallic.ssk 73KB
XP-Metallic.ssk 73KB
default.ssk 72KB
default.ssk 72KB
dogmax.ssk 70KB
dogmax.ssk 70KB
RedStar.ssk 70KB
RedStar.ssk 70KB
Vista.ssk 66KB
Vista.ssk 66KB
machine.ssk 64KB
machine.ssk 64KB
OSXP.ssk 64KB
OSXP.ssk 64KB
Beige.ssk 63KB
Beige.ssk 63KB
santa.ssk 62KB
santa.ssk 62KB
Skin.ssk 61KB
Skin.ssk 61KB
bbq.ssk 60KB
bbq.ssk 60KB
AlphaOS.ssk 58KB
共 124 条
- 1
- 2
资源评论
工具盒子
- 粉丝: 59
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功