VC中DLL的建立及呼叫方法

2021-04-12 16:47:41 字數 1759 閱讀 8199

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處即可 引用 新增服務引用 高階 新增...