日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

编写DLL所学所思(2)——导出类

發(fā)布時間:2025/3/21 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写DLL所学所思(2)——导出类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2011.10.6

燭秋

一、導(dǎo)出類的簡單方式

這種方式是比較簡單的,同時也是不建議采用的不合適方式。

只需要在導(dǎo)出類加上__declspec(dllexport),就可以實現(xiàn)導(dǎo)出類。對象空間還是在使用者的模塊里,dll只提供類中的函數(shù)代碼。不足的地方是:使用者需要知道整個類的實現(xiàn),包括基類、類中成員對象,也就是說所有跟導(dǎo)出類相關(guān)的東西,使用者都要知道。通過Dependency Walker可以看到,這時候的dll導(dǎo)出的是跟類相關(guān)的函數(shù):如構(gòu)造函數(shù)、賦值操作符、析構(gòu)函數(shù)、其它函數(shù),這些都是使用者可能會用到的函數(shù)。

這種導(dǎo)出類的方式,除了導(dǎo)出的東西太多、使用者對類的實現(xiàn)依賴太多之外,還有其它問題:必須保證使用同一種編譯器。導(dǎo)出類的本質(zhì)是導(dǎo)出類里的函數(shù),因為語法上直接導(dǎo)出了類,沒有對函數(shù)的調(diào)用方式、重命名進行設(shè)置,導(dǎo)致了產(chǎn)生的dll并不通用。

部分代碼(DLL頭文件):

//2011.10.6 //cswuyg //dll導(dǎo)出類,比較差勁的方法 #pragma once #ifdef NAIVEAPPROACH_EXPORTS #define NAIVEAPPROACH_API __declspec(dllexport) #else #define NAIVEAPPROACH_API __declspec(dllimport) #endif//基類也必須導(dǎo)出,否則警告: class NAIVEAPPROACH_API CBase { public:void Test(); private:int m_j; };//也必須導(dǎo)出 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部分。

二、導(dǎo)出類的較好方式

這種方式是比較合適的,跟com類似。

???????? 結(jié)構(gòu)是這樣的:導(dǎo)出類是一個派生類,派生自一個抽象類——都是純虛函數(shù)。使用者需要知道這個抽象類的結(jié)構(gòu)。DLL最少只需要提供一個用于獲取類對象指針的接口。使用者跟DLL提供者共用一個抽象類的頭文件,使用者依賴于DLL的東西很少,只需要知道抽象類的接口,以及獲取對象指針的導(dǎo)出函數(shù),對象內(nèi)存空間的申請是在DLL模塊中做的,釋放也在DLL模塊中完成,最后記得要調(diào)用釋放對象的函數(shù)。

???????? 這種方式比較好,通用,產(chǎn)生的DLL沒有特定環(huán)境限制。借助了C++類的虛函數(shù)。一般都是采用這種方式。除了對DLL導(dǎo)出類有好處外,采用接口跟實現(xiàn)分離,可以使得工程的結(jié)構(gòu)更清晰,使用者只需要知道接口,而不需要知道實現(xiàn)。

  部分代碼:

(1)DLL頭文件:

//2011.10.6 //cswuyg //dll導(dǎo)出類 //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)導(dǎo)出類頭文件:

//2011.10.6 //cswuyg //dll導(dǎo)出類 // 實現(xiàn)類 #pragma once#include "MatureApproach.h"class ExportImpl : public IExport { public:virtual void Hi();virtual void Test();virtual void Release();~ExportImpl(); private: };

? ? ? ? ?Demo代碼見附件MatureApproach部分。

三、總結(jié)

導(dǎo)出類是比較簡單的,比較容易混淆的概念上一篇總結(jié)已經(jīng)說完了。本質(zhì)上來說,跟導(dǎo)出函數(shù)沒差別。使用VS2005自動生成的代碼可以省去很多力氣,比起以前做練習(xí)什么都是自己動手寫方便多了。要注意一下工程的設(shè)置,熟悉它們的作用可以加快編程速度。

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

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的编写DLL所学所思(2)——导出类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。