dll是將乙個專案模組化的非常重要的組成部分,因此將dll的學習過程和工作中的經驗記錄下來以便更好地梳理知識。
編譯環境:visual c++ 6.0
一、建立動態鏈結庫
1、建立dll工程(dll工程又分為mfc dll、win 32 dll,還可以自己建立單個.cpp檔案) 2、
在原始檔*.cpp中編寫函式(每個函式結尾不需要『;』),並且
在需要匯出的函式前加 _declspec(dllexport),可參考下面**:(我用了乙個巨集dll_api 來定義_declspec(dllexport),也可以用_declspec(dllexport)直接加在匯出函式的前面)
#ifdef dll_api extern "c"
_declspec(dllexport)
#else
#define dll_api extern "c"
_declspec(dllexport)
#endif
dll_api int __stdcall addtest(int a,int b)
3、在標頭檔案*.h中宣告匯出函式,
將dll1_api定義為export,供輸出使用
#ifdef dll_api extern "c" _declspec(dllexport)
#else
#define dll_api extern "c" _declspec(dllexport)
#endif
dll_api int addtest(int a,int b)
4、build生成dll,lib檔案
到這裡,已經完成了最基礎的的函式的匯出部分,還有匯出類,這裡沒寫出來,後續再加上。
還有一點需要注意的是,在建立動態鏈結庫的時,有時會出現匯出函式名字改編的問題,可以用模組定義檔案*.def來消除問題,用法如下。也可以搜尋關鍵字「dll名字改編」等關鍵去查詢相關資料。
exports
addtest
二、呼叫動態鏈結庫
1、把.lib、.dll、和.h標頭檔案拷貝到工程目錄下
2、新增h檔案:(*.h)
#pragma comment(lib,」mfcdlltest.lib」) //告訴編譯器dll相對應的lib檔案所在路徑和檔名
extern 「c」_declspec(dllimport) int _stdcall addtest(int a,int b);//宣告匯入函式
3、在工程中使用函式addtest
1、只需把.dll拷貝到執行目錄下(注意是執行目錄,如果單步除錯時需拷貝在工程目錄;執行exe需要放在exe同級目錄下,路徑可以自行設定)
2、載入並呼叫匯出函式,使用完之後釋放
typedef int (* lpaddfun)(int ,int);//定義乙個與add_new函式接受引數型別和返回值均相同的函式指標型別 ……
……hinstance hdll;//控制代碼
lpaddfun addfun;//函式指標
hdll = loadlibrary("mfcdlltest.dll");//動態載入dll模組控制代碼
if( hdll )}
顯然,使用動態鏈結庫是比較簡單的。怎麼寫好動態鏈結庫顯得更為重要,看匯出的函式能否成功被呼叫以及函式本身的功能是否實現的這個過程需要不斷除錯。我在學習的時候也借鑑了一些前輩的總結的經驗,大家還有不懂的也可以借鑑一下:
建立和使用動態鏈結庫
在本演練中,您將建立乙個動態鏈結庫 dll 其中包含可供其他應用程式使用的有用例程。使用 dll 是一種重用 的絕佳方式。您不必在自己建立的每個程式中重新實現這些例程,而只需對這些例程編寫一次,然後從需要該功能的應用程式引用它們即可。本演練使用本機 c 有關使用本機 c 建立靜態庫的演練,請參見 演...
建立和使用動態鏈結庫 C
我們將建立的第一種型別的庫是動態鏈結庫 dll 使用 dll 是一種重用 的絕佳方式。您不必在自己建立的每個程式中重新實現同一例程,而只需對這些例程編寫一次,然後從需要該功能的應用程式引用它們即可。本演練涵蓋以下內容 本主題假定您具備 c 語言的基礎知識。從 檔案 選單中,選擇 新建 然後選擇 專案...
Qt建立和使用動態鏈結庫
一 建立共享庫 1 新其他建專案,選擇 c 庫 2 選擇共享庫,並取專案名稱,單擊下一步。這裡取名位mylib 3 按預設配置單擊下一步至模組選項,選擇所需支援的模組。這裡勾選qtcore 和qtgui。4 直接下一步至完成。現在乙個共享庫的工程就新建好了。5 右擊專案新增新檔案,選擇qt 設計師介...