⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 19.2.2 从 dll中导出函数.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 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 + -