📄 19.2.2 从 dll中导出函数.txt
字号:
19.2.2 从 DLL中导出函数
为了让 DLL导出一些函数,需要在每一个将要被导出的函数前面添加标识符 z _declspec (dllexport)。于是,修改上述如例 19-1所示 Dll l. cpp文件中的代码,这时的 add函数和 subtract函数的定义如例 19-2所示。
例 19-2
_declspec(dllexport) int add{int a , int b) return a+b;
_declspec(dllexport) int subtract(int a , int b)
{
return a-b;
利用 Build命令重新生成 Dlll动态连接库,这时 VC++的 Build窗口中将会输出如下信息 :
--------------------Configurat主 on: Dlll -Win32 Debug--------------------
Compiling. . .
Dll1. cpp
Linking. . .
Creating library Debug/Dlll.lib and object Debug/Dlll.exp
Dlll.dll -0 error(s) , 0 warning(s)
.
可以看到,这时又生成了两个新文件,其中Dll1 .lib文件就是前面提到的引入库文件,该文件中保存的是Dlll.dll中导出的函数和变量的符号名:DH1.exp文件是一个输出库文件,这里,该文件并不重要。
然后,再次利用dumpbin命令查看Dlll.dll导出函数的信息。结果如图 19.4所示。
图19.4 Dlll.dll的导出信息 (二)
可以看到,这时多了一些输出信息,其中有这么一段信息:
ordinal hint RVA name
1 0 0000100A ?add@@YAHHH归
2 1 00001005 ?subtract@@YAHHH@Z
在这段信息中, "ordinal"列列出的信息: ' 1'和 '2'是导出函数的序号; "hint"列列出的数字是提示码,该信息不重要; "RVA"列列出的地址值是导出函数在DLL模块中的位置,也就是说,通过该地址值,可以在DLL中找到它们:最后一列 "name"列出的是导出函数的名称,可以看到这些名称很奇怪, add导出函数的名称是"?add@@ YAHHH@Z", sub町act导出函数的名称是 "?subtract@@YAHHH@Z"。
我们知道, C++支持函数重载,对于重载的多个函数来说,其函数名都是一样的,为
了加以区分,在编译链接时, C++会按照自己的规则篡改函数的名称。这一过程称为"名字改编"。有的书中也称之为"名字粉碎"。不同的 C++编译器会采用不同的规则进行名字改编,这样的话,利用不同 C++编译器生成的程序在调用对方提供的函数时,可能会出现问题。关于这个问题的解决,下面的章节会详细介绍。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -