轉 Vc編寫和呼叫Dll的簡單例子

2021-06-09 14:07:24 字數 3679 閱讀 2404

用visual sudio 6.0新建乙個工程,工程的型別選擇win32 dynamic-link library.工程名任意

,其他所有選項取預設

新建乙個cpp檔案,**如下:

[cpp]view plain

copy

print?

intadd(inta ,intb)    

錄,並且裡面有乙個exe檔案.

這裡我們的工程型別是win32 dynamic-link library,在編譯鏈結以後,我們期望產生一

個debug目錄,並且裡面有乙個dll檔案

事實正是如此,我們可以用depends工具開啟這個dll檔案以檢視它匯出了什麼函式depends

工具在tools選單下.實際上它是d:/program files/microsoft visual studio/common/tools

下的乙個檔案.我們發現,這個dll沒有匯出任何東西.這是因為我們並沒有說明我們要匯出的東

西.在那個cpp裡的函式並不是缺省會被匯出的.因為它們可能只是被我們要匯出的函式的呼叫

的"內部函式".要匯出乙個函式,我們須要加上_declspec(dllexport),**變為:

code:

[cpp]view plain

copy

print?

int_declspec(dllexport) add(inta ,intb)    

再鏈結一次,再檢視該dll檔案,發現有乙個

?add@@yahhh@z

的函式.好像很怪,不過總算看到

code:

[cpp]view plain

copy

print?

#include 

#include 

voidmain()    

其中loadlibrary都是windows.h裡面宣告了的函式

編譯鏈結,都沒問題,執行.出錯了!

分析一下,程式怎麼知道去**找我們的dll呢?

它會按如下順序搜尋:當前可執行模組所在的目錄,當前目錄, windows 系統目

錄,windows 目錄。getwindowsdirectory 函式檢索此目錄的路徑,path 環境變數中列出的目

錄。所以我們要把我們的dll複製乙份到這個測試工程的debug目錄之後,再執行

還是出錯了!

分析一下.我們剛才看到的是乙個叫?add@@yahhh@z

函式.那麼,是不是這個原因呢?

把**改為:

code:

[cpp]view plain

copy

print?

#include 

#include 

voidmain()    

再編譯鏈結,執行,成功了!那麼怎麼可以正確匯出我們函式的名字呢?

在生成dll的工程的**加上extern "c",改為:

code:

[cpp]view plain

copy

print?

extern

"c"int_declspec(dllexport) add(inta ,intb)    

編譯鏈結後,檢視dll檔案,可以看到匯出的函式變為add了,這時下面**可以正常工作了

code:

[cpp]view plain

copy

print?

#include 

#include 

voidmain()    

除了用_declspec(dllexport)指明要匯出的函式,用extern "c"來糾正名字,我們還可用

乙個.def檔案來達到以上目的

在dll工程裡新建乙個檔案,型別選text file,在名字要帶上字尾.def.內容如下:

[cpp]view plain

copy

print?

library  

exports  

add  

剩下的步驟就和之前一樣了,用def檔案還可以改變匯出的函式的名字,例如

[cpp]view plain

copy

print?

library  

exports  

myadd = add  

使得匯出的函式叫myadd,而不是add.還可以給函式指定乙個序號

如:[cpp]view plain

copy

print?

library  

exports   

myadd=add @4  

給myadd指定了乙個序號

在測試工程裡,可以根據序號取得我們的函式:

code:

[cpp]view plain

copy

print?

#include 

#include 

voidmain()    

以上講的是執行時靜態載入dll,下面講啟動時動態載入dll

產生dll的工程不用變,還是上面這個(名字是myadd,序號為4)

測試**改為:

//先把dll.lib檔案複製到本工程目錄裡

code:

[cpp]view plain

copy

print?

#include 

#pragma comment(lib,"dll.lib")

extern

intmyadd(int,int);//沒有加這句而只加上面這句(或在工程設定裡加上dll.lib)會鏈結錯誤

voidmain()    

#pragma comment(lib,"dll.lib")指明了用到哪個dll,其中dll.lib可以在debug找到.我們也

要把dll.lib複製到測試工程目錄(不是debug目錄).我們也可以在工程屬性裡新增.方法是

project--settings--link,在object/libraries modules最後加上 dll.lib

extern int add(int ,int );指明了我們的add是乙個外部函式,而不是在本檔案定義的

最後,強調一下,要把該複製的檔案複製到正確的地方.當你產生的dll檔案和我說的不一

致時,試一下選build-rebuild all

Vc編寫和呼叫Dll的簡單例子

用visual sudio 6.0新建乙個工程,工程的型別選擇win32 dynamic link library.工程名任意 其他所有選項取預設 新建乙個cpp檔案,如下 錄,並且裡面有乙個exe檔案.這裡我們的工程型別是win32 dynamic link library,在編譯鏈結以後,我們期...

VC編寫和呼叫DLL的簡單例子

用visual sudio 6.0新建乙個工程,工程的型別選擇win32 dynamic link library.工程名任意 其他所有選項取預設 新建乙個cpp檔案,如下 int add int a int b 錄,並且裡面有乙個exe檔案。這裡我們的工程型別是win32 dynamic link...

C 編寫 呼叫 dll 簡單例子

c 建立dll 1.建立win32控制台程式,選擇dll 2.新增標頭檔案 標頭檔案中定義巨集 如下 ifdef dynamiclibrary exports 該dll的定義巨集工程屬性 c c preprocessor define dll def declspec dllexport 匯出 el...