编写DLL所学所思(2)——导出类
2011.10.6
燭秋
一、導出類的簡單方式
這種方式是比較簡單的,同時也是不建議采用的不合適方式。
只需要在導出類加上__declspec(dllexport),就可以實現導出類。對象空間還是在使用者的模塊里,dll只提供類中的函數代碼。不足的地方是:使用者需要知道整個類的實現,包括基類、類中成員對象,也就是說所有跟導出類相關的東西,使用者都要知道。通過Dependency Walker可以看到,這時候的dll導出的是跟類相關的函數:如構造函數、賦值操作符、析構函數、其它函數,這些都是使用者可能會用到的函數。
這種導出類的方式,除了導出的東西太多、使用者對類的實現依賴太多之外,還有其它問題:必須保證使用同一種編譯器。導出類的本質是導出類里的函數,因為語法上直接導出了類,沒有對函數的調用方式、重命名進行設置,導致了產生的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:int m_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) #endifclass 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代碼附件:
http://files.cnblogs.com/cswuyg/%E7%BC%96%E5%86%99DLL%E6%89%80%E5%AD%A6%E6%89%80%E6%80%9D(2)(%E5%AF%BC%E5%87%BA%E7%B1%BB).rar
參考資料:
http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的编写DLL所学所思(2)——导出类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转贴:BMP格式详解 二 (转载)
- 下一篇: 4月3日 尤金.卡巴斯基在北大精彩演讲