1. 程式人生 > >VS製作動態庫注意事項

VS製作動態庫注意事項

  1. 匯出函式
    當我們需要匯出函式的時候,應該考慮的是以標準呼叫約定(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檔案需要在配置工程裡面進行設定
在這裡插入圖片描述

  1. 匯出類
    匯出的類的方法和匯出函式差不多.類中函式的許可權依然有效
	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;
}
/*這麼做的好處有:一是,一個類是有許可權的,這樣的話我們可以將實現中的類私有許可權和
保護許可權的成員函式和成員不必再暴露給使用者,安全和便於使用者使用。二是,這樣將實現進
行了遮蔽,我們實現發生了變化,不會對使用者產生影響。