此中只有實際才操作,而無相關理論
首先,用
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
檔案。
好,下面我們就用
vc寫個程式呼叫它。在呼叫的函式中,首先要獲得
dll的控制代碼,有如下語句:
hinstance dllinstance;
dllinstance=::loadlibrary(strdllurl);
if(dllinstance==null)
afxmessagebox("can't open dll file");
其中strdllurl
是mydll.dll
路徑的字串,這樣程式才能找到它。
::loadlibrary
獲得引數標識的
dll檔案的控制代碼。
獲得控制代碼後,下面要獲得函式位址以便執行它。有如下語句:
farproc proc;
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
宣告變數既可呼叫,如下:
mywentmyproc;
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的建立及呼叫方法
dll的建立 首先,用vc整合開發介面中的 新建 新建乙個專案。無論是vc6.0還是vc.net,都有建立dll專案的選項。只不過有些稍有不同,例如vc.net中就有isapi dll,擴充套件儲存過程dll等,這些都不在討論的範圍。例如我們建立了乙個用靜態連線mfc庫的dll專案,名稱為mydll...
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處即可 引用 新增服務引用 高階 新增...