這里說的不是用LoadLibrary動(dòng)態(tài)載入,雖然VC++用動(dòng)態(tài)調(diào)用其實(shí)很容易,但很多VC++程序員很不習(xí)慣這種做法,因?yàn)橐约汗芾鞤LL的載入和釋放,有的甚至不懂怎么動(dòng)態(tài)調(diào)用DLL,已經(jīng)依賴有H文件聲明和導(dǎo)入靜態(tài)庫(LIB)方式。
所以一直以來困擾很多人,總是聽到有人問,VC++怎么調(diào)用易的DLL?!
今天,我就來介紹這種在VC++常規(guī)的方法來調(diào)用易DLL。首先,我們需要一個(gè)小工具,這個(gè)工具是本人編寫的,就是專門生成VC++需要的DLL導(dǎo)入函數(shù)庫,當(dāng)然不是把易的DLL轉(zhuǎn)成靜態(tài)庫,靜態(tài)庫也分幾種,一種就是我們需要的,包含有DLL函數(shù)信息的庫,C++調(diào)用DLL需要這個(gè)。我這個(gè)工具就是生成這種庫的。
mY6DezBh.rar (219 K) 下載次數(shù):565
下載工具以后,分兩步驟,第一步從DLL中導(dǎo)出函數(shù)的名稱說明文件*.Def,以“VCode.dll”為例,它生成的VCode.def文件是這樣的:
LIBRARY Vcode.dll
EXPORTS
DeError @1
DeInfo @2
GetByteVcode @3
GetFileVcode @4
GetRecNum @5
GetUrlVcode @6
GetWebVcode @7
LoadDe @8
LIBRARY 易編的DLL名稱,這個(gè)名稱不能亂改的,要對(duì)應(yīng)實(shí)際文件名,相當(dāng)于LoadLibrary()的參數(shù),改了程序就啟動(dòng)不了,而且提示框也是系統(tǒng)的,這和動(dòng)調(diào)用DLL不同。
EXPORTS 后面跟著的就是DLL的所有導(dǎo)出函數(shù)名稱,名稱后面的由空格隔開的@XX數(shù)字是函數(shù)的序號(hào),這也是不能改動(dòng)的。
那么能改的是什么?只有函數(shù)名了。為什么要改函數(shù)名?
因?yàn)閂C++對(duì)于C語言風(fēng)格(extern "C" )的導(dǎo)入函數(shù)都是要上 _函數(shù)名@N 這種式樣的修飾符,不然編譯不了。易編寫的DLL函數(shù)是不能編寫這種名稱的,所以在這里要自己動(dòng)手修改,@N 的N是用數(shù)字表示(注意,和上面的@意義不同)這里@數(shù)字是表示函數(shù)的參數(shù)總字節(jié)數(shù)之和,即調(diào)用棧大小。就是由參數(shù)個(gè)數(shù)和類型決實(shí)的,通常是 參數(shù)個(gè)數(shù) × 4 ,如果參數(shù)有日期型或長整數(shù)型或雙精度小數(shù)型(非傳址,即參考指針型),每有一個(gè)參數(shù)這些類型的就要再加4,因?yàn)檫@些類型是8字節(jié)的,相當(dāng)于其它類型的兩個(gè)參數(shù),實(shí)際編譯也是分兩段兩次入?yún)?shù)棧道的。
如果不會(huì)計(jì)算,那就更簡單了,直接開始第二步驟,先別修改了,把剛才的*.Def編譯成LIB靜態(tài)庫。
最后就是寫C++需要的*.h文件了,上面有關(guān)于易DLL導(dǎo)出函數(shù)的聲明,接著上例:
//導(dǎo)入函數(shù)表靜態(tài)庫文件(剛才我們編譯出來的Vcode.LIB)
#pragma comment(lib, "Vcode.lib")
extern "C" //其它語言編譯的DLL要用C風(fēng)格
{
//DLL函數(shù)
int _stdcall LoadDe(char* strFilePath,char* strFilePath2);
....
}
然后編譯VC++工程,是調(diào)用易DLL的,肯定會(huì)出錯(cuò),你看看找不到函數(shù)了吧:
Linking...
VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _DeInfo@4
VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _DeError@4
VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _LoadDe@8
VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _GetUrlVcode@12
VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _GetWebVcode@16
VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _GetFileVcode@12
VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _GetByteVcode@16
不過它也把要求的函數(shù)名列出來了,不用自己計(jì)算了,把這些@數(shù)字加到相應(yīng)的函數(shù)后面,修改DEF文件,如下:
LIBRARY Vcode.dll
EXPORTS
DeError@4 @1
DeInfo@4 @2
GetByteVcode@16 @3
GetFileVcode@12 @4
GetRecNum@16 @5
GetUrlVcode@12 @6
GetWebVcode@16 @7
LoadDe@8 @8
這里有兩個(gè)@也是跟數(shù)字,注意不要改錯(cuò)了,是改緊跟著函數(shù)名的。改好后重新編譯LIB,再次構(gòu)建VC++工程,這次全部通過了。
你把H文件,LIB文件和DLL文件三個(gè)文件拿給喜歡偷懶的VC++程序員,這次易和C++的合作就算圓滿完成了。[em01]
聯(lián)系客服