用visual sudio 6.0新建乙個工程,工程的型別選擇win32 dynamic-link library.工程名任意
其他所有選項取預設
新建乙個cpp檔案,**如下:
int add(int a ,int b)
錄,並且裡面有乙個exe檔案。
這裡我們的工程型別是win32 dynamic-link library,在編譯鏈結以後,我們期望產生一
個debug目錄,並且裡面有乙個dll檔案。
事實正是如此,我們可以用depends工具開啟這個dll檔案以檢視它匯出了什麼函式depends
工具在tools選單下。實際上它是d:/program files/microsoft visual studio/common/tools
下的乙個檔案。我們發現,這個dll沒有匯出任何東西。這是因為我們並沒有說明我們要匯出的東
西。在那個cpp裡的函式並不是缺省會被匯出的。因為它們可能只是被我們要匯出的函式的呼叫
的"內部函式"。要匯出乙個函式,我們須要加上_declspec(dllexport),**變為:
int _declspec(dllexport) add(int a ,int b)
再鏈結一次,再檢視該dll檔案,發現有乙個 ?add@@yahhh@z 的函式。好像很怪,不過總算看到東西了。
現在來測試一下這個dll
新建乙個cpp檔案,**如下:
#include #include void main()
編譯鏈結後,檢視dll檔案,可以看到匯出的函式變為add了,這時下面**可以正常工作了。
#include #include void main()
{ typedef int (*add)(int ,int);//函式指標型別
hinstance hint = ::loadlibrary("dll.dll");//載入我們剛才生成的dll
add add = (add)getprocaddress(hint,"add");//取得dll匯出的add方法
cout《除了用_declspec(dllexport)指明要匯出的函式,用extern "c"來糾正名字,我們還可用乙個.def檔案來達到以上目的。
在dll工程裡新建乙個檔案,型別選text file,在名字要帶上字尾.def。內容如下:
library
exports
add
剩下的步驟就和之前一樣了,用def檔案還可以改變匯出的函式的名字,例如
library
exports
myadd = add
使得匯出的函式叫myadd,而不是add。還可以給函式指定乙個序號
如:
library
exports
myadd=add @4
給myadd指定了乙個序號
在測試工程裡,可以根據序號取得我們的函式:
#include #include void main()
{ typedef int (*add)(int,int);
hinstance hinstance=::loadlibrary("dll.dll");
add add=(add)getprocaddress(hinstance,makeintresource(4));//根據序號取得函
數 cout《以上講的是執行時靜態載入dll,下面講啟動時動態載入dll
產生dll的工程不用變,還是上面這個(名字是myadd,序號為4)
測試**改為:
//先把dll.lib檔案複製到本工程目錄裡
#include #pragma comment(lib,"dll.lib")
extern int myadd(int ,int );//沒有加這句而只加上面這句(或在工程設定裡加上dll.lib)會鏈結錯誤
void main()
{ cout<#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檔案,如下 cpp view plain copy print?intadd inta intb 錄,並且裡面有乙個exe檔案.這裡我們的...
C 編寫 呼叫 dll 簡單例子
c 建立dll 1.建立win32控制台程式,選擇dll 2.新增標頭檔案 標頭檔案中定義巨集 如下 ifdef dynamiclibrary exports 該dll的定義巨集工程屬性 c c preprocessor define dll def declspec dllexport 匯出 el...