VS製作動態庫注意事項
阿新 • • 發佈:2018-12-23
- 匯出函式
當我們需要匯出函式的時候,應該考慮的是以標準呼叫約定(stdcall)的形式提供給使用者。具體的呼叫約定的區別可以參考下文。
https://blog.csdn.net/chenlycly/article/details/51329886
在介面宣告檔案中,我們需要定義個用來做匯入匯出開關的巨集,再做一個標準呼叫約定的巨集。當需要匯出的時候,我們只需要在前面加一個MYAPI_DLL就可以了,匯入的時候,什麼都不需要改變,直接使用引入介面宣告檔案,對應的dll,lib就可以了。
#ifdef MYAPI_DLL #define MYAPI extern "C" _declspec(dllexport) #else #define MYAPI extern "C" _declspec(dllimport) #endif #ifdef WIN32 #define STDCALL __stdcall //需要注意的時,_stdcall是會改名的,我們是可以通過depend看出的,_cdecl不會改名的,如果不想換名的話,還需要藉助.def檔案 #else #ifdef i386 #define STDCALL __attribute__((stdcall)) #else #define STDCALL #endif #endif MYAPI int STDCALL Add(int a, int b); MYAPI int STDCALL Subtrac(int a, int b);
在建一個.def檔案
LIBRARY Dll3 //匯出的動態庫庫名
EXPORTS
Add //匯出的函式名
Subtrac
需要注意的是def檔案需要在配置工程裡面進行設定
- 匯出類
匯出的類的方法和匯出函式差不多.類中函式的許可權依然有效
class _declspec(dllexport) A { }; /*需要匯出只匯出幾個成員函式時,需要在成員函式前加上_declspec(dllexport)就可以 了,但是匯出類的時候,我們需要考慮下,最好將介面和實現分離,即pImple.*/ class A;//前置宣告 calss _declspec(dllexport) A { A:a(new A)(){} //構造時生成對應的實現類的例項 ~A(){delete a} //析構時刪除 void Open() { a->Open();}//本身不實現,通過實現的例項呼叫 void Close() {a->Close();} private: ImA *a; }; calss ImA { publice: void Open(){} void Close() {} private: void kkkk(){} int m_name; } /*這麼做的好處有:一是,一個類是有許可權的,這樣的話我們可以將實現中的類私有許可權和 保護許可權的成員函式和成員不必再暴露給使用者,安全和便於使用者使用。二是,這樣將實現進 行了遮蔽,我們實現發生了變化,不會對使用者產生影響。