?? 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 + -