對於其他的程式要想訪問乙個dll中的函式的話,這些函式必須是已經被匯出的函式;那麼我們怎麼檢視乙個dll中有哪些函式是被匯出的呢?
我們用visual studio中的乙個工具檢視,具體步驟是:
1、進入dos
2、今天dll所在的路徑
3、使用dumpbin命令(如果在dos下找不到dumpbin,我們可以進入visual的安裝路徑下,bin資料夾中有乙個dumpbin.exe檔案,在bin目錄下還有乙個批處理檔案vcvars32.bat,將這個檔案拖入dos下,執行,就可以了。)
4、dumpbin -exports ***.dll 就可以檢視匯出的函式
dumpbin -imports ***.exe 檢視可執行程式的輸入資訊,包括它用到哪些dll
5、我們要想匯出dll中的函式,在每乙個函式的前面加_declspec(dllexport)
6、通過以上操作,我們可以看到我們匯出的函式的名字很怪,並不是我們定義的名字,這是由於c++編譯器的問題,為了支援函式的過載,編譯器會改編函式的名字,不同的編譯器用不同的規則進行改編。
7、我們如何匯出呢?
(1)只將lib檔案拷貝到工程下,編譯就會通過,但是執行的時候會出錯。錯誤如下圖:(圖中的路徑為搜尋dll的路徑順序)
(2)將dll拷貝過來,但是在我們使用dll中的函式的時候,要宣告一下我們的函式是在外部定義的,如下:
_declspec(dllimport) int add(int a, int b) 或 extern int add(int a, int b)
_declspec(dllimport) 這句話相當於我們告訴編譯器我們的函式是從.lib中輸入的,這樣效率更好。
(3)我們也可以將_declspec(dllimport) int add(int a, int b)寫在乙個.h檔案中然後,在呼叫dll中函式的地方新增該.h檔案。
note:在dll中,只有匯出的函式才可以被使用。沒有匯出的函式,是不能夠被訪問的。
二:在dll中我們還可以匯出乙個c++的類,如何匯出?和匯出函式一樣,舉個例子吧,看**:
dll1.h
#ifdef dll1_api
#else
#define dll1_api _declspec(dllimport)
#endif
dll1_api int add(int a,int b);
dll1_api int subtract(int a,int b);
class dll1_api point
;
dll1.cpp
#define dll1_api _declspec(dllexport)
#include "dll1.h"
#include #include int _stdcall add(int a,int b)
int _stdcall subtract(int a,int b)
void point::output(int x,int y)
使用上面函式**,mfc對話方塊三個按鈕的**,不要忘記加入上面的dll1.h標頭檔案
void cdlltestdlg::onbtnadd()
void cdlltestdlg::onbtnsubtract()
void cdlltestdlg::onbtnoutput()
動態鏈結庫 一
形式1 返回型別 函式名 參數列 char pfun int char glfun int a void main 形式1 typedef 返回型別 新型別 參數列 typedef char ptrfun int ptrfun pfun char glfun int a void main depe...
動態鏈結庫 靜態鏈結庫
包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...
靜態鏈結庫 動態鏈結庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...