DLL那些事儿(3)

本文介绍了动态链接库(DLL)的两种使用方式:显式链接和隐式链接。显式链接示例展示了如何通过LoadLibraryExW和GetProcAddress函数加载并调用DLL中的函数,而隐式链接则是通过编译时链接到导入库来实现。通过dumpbin.exe工具分析,可以看出显式链接的程序不依赖hello.dll,而隐式链接的程序直接依赖于hello.dll。
摘要由CSDN通过智能技术生成

DLL那些事(3)

链接和导入库 (Linking and Import Libraries)

显式链接(Explicit Linking)

// PrintGreeting.cpp
#include <Windows.h>
#include <stdio.h>

int main()
{
	HMODULE const HelloDll = LoadLibraryExW(L"Hello.dll", nullptr, 0);
	
	// char const* __cdecl GetGreeting();
	using GetGreetingType = char const* (*__cdecl)();

	GetGreetingType const GetGreeting = 
		reinterpret_cast<GetGreetingType>(
			GetProcAddress(HelloDll, "GetGreeting"));

	puts(GetGreeting());

	return 0;
}
编译:

将源码和hello.dll放到同一个目录下 输入cl PrintGreeting.cpp即可得到PrintGreeting.exe

在命令行运行编译好的程序可以看到一下输出

在这里插入图片描述

使用dumpbin.exe 查看PrintGreeting.exe依赖的DLL

在这里插入图片描述

可以看到PrintGreeting.exe依赖的动态库只有kernel32.dll,没有hello.dll

再使用dumpbin.exe查看一下PrintGreeting.exe的导入表,输入dumpbin.exe /imports PrintGreeting.exe会列出很长的一堆东西,我们这里只展示一部分。

在这里插入图片描述

可以看到程序是通过kernel32.dll中的函数加载调用DLL的,所以我们不能动态加载和调用kernel32.dll中的函数。

隐式链接(Implicit Linking)

// PrintGreetingImplicit.cpp
#include <stdio.h>

extern "C" char const* GetGreeting();

int main(){
    puts(GetGreeting());
    return 0;
}
编译

与显示链接不同,隐式链接的编译过程相对复杂一点

link Hello.obj	/DLL	/NOENTRY	/EXPORT:GetGreeting
cl /c PringGreetingImplicit.cpp
link PringGreetingImplicit.obj Hello.lib

在这里插入图片描述

可以看到隐式链接编译出来的程序是直接依赖hello.dll动态库的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值