dll的建立:
首先,用vc整合開發介面中的「新建」,新建乙個專案。無論是vc6.0還是vc.net,都有建立dll專案的選項。只不過有些稍有不同,例如vc.net中就有isapi dll,擴充套件儲存過程dll等,這些都不在討論的範圍。例如我們建立了乙個用靜態連線mfc庫的dll專案,名稱為mydll
。 然後,編輯mydll.cpp檔案,在其中加入我們自己的函式void go()。注意,不需要在mydll.h
中宣告它,而需要將函式頭變成如下樣子:
extern 「c」 __declspec(dllexport) void go()
dllexport
表示這個函式是由外部呼叫的。
由於是否帶引數,要影響到外部呼叫的方式,因此,我們再宣告乙個帶引數的函式:
extern 「c」 __declspec(dllexport) void went(cstring str)
ok,下面編譯連線形成mydll.dll
檔案。
dll的呼叫:
下面我們就用vc寫個程式呼叫它。在呼叫的函式中,首先要獲得dll
的控制代碼,有如下語句:
hinstance dllinstance;
dllinstance=::loadlibrary(strdllurl);
if(dllinstance==null)
afxmessagebox("can't open dll file");
其中strdllurl是mydll.dll路徑的字串,這樣程式才能找到它。::loadlibrary獲得引數標識的dll
檔案的控制代碼。
獲得控制代碼後,下面要獲得函式位址以便執行它。有如下語句:
farprocproc;
proc=getprocaddress(dllinstance,"go");
if(proc==null) afxmessagebox("can't find function");
else proc();
farproc
是乙個遠端過程指標,通過getprocaddress獲得函式的位址。它的兩個引數就是dll
檔案控制代碼和函式的名字了。
然後farproc就可以和go一樣的使用了,它就是go ,go
就是它。
而對於帶引數的dll中的函式,呼叫方法有所不同。因為對函式的呼叫是通過對它位址的引用進行的,這樣,傳入引數對不對,在函式呼叫程式的編譯和聯接過程中,無法知道其正確性。因此,要在呼叫程式中對dll中帶引數的函式做個宣告,如mydll中的went,
我們要做個宣告如下:
typedef void (far __cdecl *mywent)(cstring);
然後以型別mywent
宣告變數既可呼叫,如下:
mywent myproc;
myproc =(mywent)getprocaddress(dllinstance,"go");
if(myproc ==null) afxmessagebox("can't find function");
else myproc (「o-----yeah---------」);
注意宣告的時候呢,由於dll中went的定義為c語言呼叫規範,因此mywent前一定要用__cdecl,而vc中常用的__stdcall是pascal
呼叫規範,不可以的。一定要注意。
VC中DLL的建立及呼叫方法
此中只有實際才操作,而無相關理論 首先,用 vc整合開發介面中的 新建 新建乙個專案。無論是 vc6.0 還是vc.net 都有建立 dll專案的選項。只不過有些稍有不同,例如 vc.net 中就有isapi dll 擴充套件儲存過程 dll等,這些都不在討論的範圍。例如我們建立了乙個用靜態連線 m...
vc 建立dll檔案以及dll呼叫
一 生成dll 1 用vc建立乙個win32dll工程 dlltest,選上 匯出符號 2 在dlltest.cpp中編寫匯出函式fun 這個函式是別的程式要呼叫的函式 int fun int i 3 在dlltest.h中宣告匯出這個函式 declspec dllexport int fun in...
VC中呼叫C 的DLL
在工程編譯時同步互操作註冊生成檔案。在vs中c 專案,選擇專案屬性,開啟屬性配置頁,生成頁中選擇 為com互操作註冊 核取方塊,在編譯時會同時生成tlb檔案 匯入webservices 如果類中未用到webservices,該過程可以省略,直接跳到建立c dll處即可 引用 新增服務引用 高階 新增...