c++ 純虛擬函式匯出
一、匯出類的簡單方式
這種方式是比較簡單的,同時也是不建議採用的不合適方式。
只需要在匯出類加上__declspec(dllexport),就可以實現匯出類。物件空間還是在使用者的模組裡,dll只提供類中的函式程式碼。不足的地方是:使用者需要知道整個類的實現,包括基類、類中成員物件,也就是說所有跟匯出類相關的東西,使用者都要知道。通過Dependency Walker可以看到,這時候的dll匯出的是跟類相關的函式:如建構函式、賦值操作符、解構函式、其它函式,這些都是使用者可能會用到的函式。
這種匯出類的方式,除了匯出的東西太多、使用者對類的實現依賴太多之外,還有其它問題:必須保證使用同一種編譯器。匯出類的本質是匯出類裡的函式,因為語法上直接匯出了類,沒有對函式的呼叫方式、重新命名進行設定,導致了產生的
部分程式碼(DLL標頭檔案):
//2011.10.6 //cswuyg //dll匯出類,比較差勁的方法 #pragma once #ifdef NAIVEAPPROACH_EXPORTS #define NAIVEAPPROACH_API __declspec(dllexport) #else #define NAIVEAPPROACH_API __declspec(dllimport) #endif //基類也必須匯出,否則警告: class NAIVEAPPROACH_API CBase { public: void Test(); private: intm_j; }; //也必須匯出 class NAIVEAPPROACH_API CDate { public: void Test2(); private: int m_k; }; class NAIVEAPPROACH_API CNaiveApproach : public CBase { public: CNaiveApproach(int i = 0); // TODO: add your methods here. void Func(); private: int m_iwuyg; CDate m_dobj; };
Demo程式碼見附件NaiveApproach部分。
二、匯出類的較好方式
這種方式是比較合適的,跟com類似。
結構是這樣的:匯出類是一個派生類,派生自一個抽象類——都是純虛擬函式。使用者需要知道這個抽象類的結構。DLL最少只需要提供一個用於獲取類物件指標的介面。使用者跟DLL提供者共用一個抽象類的標頭檔案,使用者依賴於DLL的東西很少,只需要知道抽象類的介面,以及獲取物件指標的匯出函式,物件記憶體空間的申請是在DLL模組中做的,釋放也在DLL模組中完成,最後記得要呼叫釋放物件的函式。
這種方式比較好,通用,產生的DLL沒有特定環境限制。藉助了C++類的虛擬函式。一般都是採用這種方式。除了對DLL匯出類有好處外,採用介面跟實現分離,可以使得工程的結構更清晰,使用者只需要知道介面,而不需要知道實現。
部分程式碼:
(1)DLL標頭檔案:
//2011.10.6 //cswuyg //dll匯出類 //dll跟其使用者共用的標頭檔案 #pragma once #ifdef MATUREAPPROACH_EXPORTS #define MATUREAPPROACH_API __declspec(dllexport) #else #define MATUREAPPROACH_API __declspec(dllimport) #endif class IExport { public: virtual void Hi() = 0; virtual void Test() = 0; virtual void Release() = 0; }; extern "C" MATUREAPPROACH_API IExport* _stdcall CreateExportObj(); extern "C" MATUREAPPROACH_API void _stdcall DestroyExportObj(IExport* pExport);
(2)匯出類標頭檔案:
//2011.10.6 //cswuyg //dll匯出類 // 實現類 #pragma once #include "MatureApproach.h" class ExportImpl : public IExport { public: virtual void Hi(); virtual void Test(); virtual void Release(); ~ExportImpl(); private: };
Demo程式碼見附件MatureApproach部分。
三、總結
匯出類是比較簡單的,比較容易混淆的概念上一篇總結已經說完了。本質上來說,跟匯出函式沒差別。使用VS2005自動生成的程式碼可以省去很多力氣,比起以前做練習什麼都是自己動手寫方便多了。要注意一下工程的設定,熟悉它們的作用可以加快程式設計速度。
Demo程式碼附件:
參考資料: