應用程式可以呼叫的dll函式,在dll中叫做匯出函式,而在應用程式中叫做匯入函式。應用程式中的匯入函式與dll檔案中的匯出函式進行鏈結有兩種方式:隱式鏈結和顯式鏈結。
在建立乙個dll檔案時,編譯器會自動生成乙個與該檔案對應的導入庫檔案(擴充套件名為lib)。該檔案包含了dll中所有匯出函式所有dll庫的名稱,應用程式可以根據這個檔案來尋找並載入dll。由於在程式中沒有出現載入dll的**,所以把這種鏈結方式叫做隱式鏈結。
windows搜尋dll的順序為:
1. 包含應用程式exe檔案的目錄。
2. 程序的當前工作目錄。
3. windows系統目錄。
4. windows目錄。
5. 列在path環境變數中的一系列目錄。
例子:宣告匯入函式。
#include
"stdafx.h"
void
sayhello(void);
int_tmain(int
argc, _tchar* argv)
另外在工程設定好lib的路徑。
如果沒有設定好,將連線不過。如下:
>linking...
1>2_dlldemocall.obj : error lnk2019: unresolved external symbol "void __cdecl sayhello(void)" (?sayhello@@yaxxz) referenced in function _wmain
注:隱式
鏈結需要庫檔案對應的標頭檔案
如果在應用程式中使用windows api
函式直接完成
dll庫函式的呼叫,那麼這種做法就叫做dll的顯式方式,當然這不必使用導入庫檔案了。
方法如下:
1獲得dll庫
通過呼叫win32的loadlibrary 函式,並以要使用的dll檔案所在的路徑為引數,可以取得dll。loadlibaray函式的原型如下:
hinstance loadlibrary(
lpctstrlplibfilename // ddl的路徑
);
函式的返回值為dll庫的控制代碼。2.
獲得dll函式
獲得了dll的控制代碼之後,接下來就可以在應用程式中通過呼叫win32 api函式getprocaddress來獲得該dll中與匯入函式相匹配的匯出函式了。原型如下:
farproc
getprocaddress(
hmodulehmodule,// handle to dll module dll的控制代碼
lpcstrlpprocname // name of function 匯入函式的名稱
);
getprocaddress函式的返回值為dll匯出函式位址。
3釋放dll庫
bool
freelibrary(
hmodulehlibmodule // handle to loaded library module dll控制代碼
);
採用顯式鏈結方式呼叫dll庫,程式設計師可以決定載入哪個dll檔案,這使得程式的設計更為靈活。 動態鏈結庫使用 靜 動態鏈結庫使用總結
一 靜態庫編寫 1.首先當然是開vs然後建立乙個靜態庫工程啦 2.格式.一般有標頭檔案.h和原檔案.cpp,當然你也可以寫一在乙個cpp裡.mydll.h extends c mydll.cpp include mylib.h int sum int num1,int num2 int mult i...
使用動態鏈結庫
1.動態鏈結庫是程式執行時載入的庫,當動態鏈結庫正確安裝後,所有的程式都可以使用動態庫來執行程式。動態鏈結庫是目標檔案的集合,目標檔案在動態鏈結庫中的組織方式是按照特殊方式形成的。庫中函式和變數的位址是相對位址,不是絕對位址,其真實位址在呼叫動態庫的程式載入時形成。2.動態鏈結庫的名稱有別名 son...
使用動態鏈結庫
1.先建立乙個動態鏈結庫的工程 vs下,file new project win32 project dll t.h ifdef myapi export define myapi declspec dllexport else define myapi declspec dllimport end...