电竞比分网-中国电竞赛事及体育赛事平台

分享

DLL接口的實(shí)現(xiàn)(COM結(jié)構(gòu)思想)二

 imelee 2017-09-25

第一篇已經(jīng)對(duì)COM結(jié)構(gòu)思想有一定的了解,這篇做一個(gè)簡(jiǎn)單的實(shí)現(xiàn)DLL接口。關(guān)于一些DLL的導(dǎo)入導(dǎo)出和一些.lib的包含我這里就不說明了,具體的細(xì)節(jié)可以看這里:http://blog.csdn.net/u011599942/article/details/11195667

代碼的實(shí)現(xiàn)部分如下:

接口頭文件 IUnknowService.h

  1. #include<iostream>  
  2. #include<string>  
  3. using namespace std;  
  4.   
  5. #ifdef _EXPORTING  
  6. #define CLASS_DECLSPEC __declspec(dllexport)  
  7. #else  
  8. #define CLASS_DECLSPEC __declspec(dllimport)  
  9. #endif  
  10.   
  11. //IUnknowService 接口主要是為了查詢這個(gè)組件里實(shí)現(xiàn)了哪些接口。  
  12. //如果指定查詢的接口不存在(可能目前使用的是這個(gè)組件的早期的版本),  
  13. //那么返回值是NULL。  
  14.   
  15. class IUnknowService  
  16. {  
  17. public:  
  18.     virtual void QueryInterface(string type,void** ppv) = 0;  
  19.     virtual void  Add() = 0;  
  20.     virtual void  Release() = 0;  
  21. };  
  22.   
  23. //接口的實(shí)現(xiàn)實(shí)際上也是一個(gè)中間層。實(shí)際提供下載服務(wù)的是其他一些類。  
  24. class IPerson:public IUnknowService  
  25. {  
  26. public:  
  27.     virtual void Eat() = 0;  
  28. };  
  29. class IBook:public IUnknowService  
  30. {  
  31. public:  
  32.     virtual void Read() = 0;  
  33. };  


這邊的IUnknowService與標(biāo)準(zhǔn)的IUnknow的定義不同,標(biāo)準(zhǔn)的是有返回值的,而且第一個(gè)參數(shù)是個(gè)ID。這里只是借用COM的思想來簡(jiǎn)單實(shí)現(xiàn)下。IPerson 和 IBook 是兩個(gè)不同的接口類。可以這樣理解,不同的接口類可以是不同時(shí)期發(fā)行的DLL庫的不同版本,這樣只要同時(shí)繼承了這些版本的接口并可以實(shí)現(xiàn)版本的兼容。

接口實(shí)現(xiàn)類 InterFace.h

  1. #include"IUnknowService.h"  
  2.   
  3. class CTeacher:public IPerson,IBook  
  4. {  
  5. public:  
  6.     CTeacher():m_refCount(0){   }  
  7.     virtual void QueryInterface(string type,void** ppv);  
  8.     virtual void Add();  
  9.     virtual void Release();  
  10.     virtual void Eat();  
  11.     virtual void Read();  
  12.     int GetrefCount() { return m_refCount; }  
  13. private:  
  14.     int m_refCount;  //引用計(jì)數(shù)  
  15. };  
  16. void CTeacher::QueryInterface(string type,void** ppv)  
  17. {  
  18.     if("Person" == type)  
  19.         *ppv = static_cast<IPerson*> (this);  
  20.     else if("Book" == type)  
  21.         *ppv = static_cast<IBook*>(this);  
  22.     if(*ppv)  
  23.         static_cast<IUnknowService*>(*ppv)->Add();  
  24. }  
  25. void CTeacher::Release()  
  26. {  
  27.     m_refCount--;  
  28.     if(0 == m_refCount)  
  29.     {  
  30.         delete this;  
  31.         printf("Component destroy...\n");  
  32.     }  
  33.     else  
  34.         printf("引用計(jì)數(shù)為:%d \n",m_refCount);  
  35. }  
  36. void CTeacher::Add(){   m_refCount++; printf("引用計(jì)數(shù)為:%d \n",m_refCount); }  
  37. void CTeacher::Eat(){   printf("Eatting!\n"); }  
  38. void CTeacher::Read(){  printf("Reading!\n"); }  

這個(gè)是接口的實(shí)現(xiàn)類,m_refCount用來保存引用計(jì)數(shù)。

DLL的導(dǎo)出:main.cpp

  1. #include"InterFace.h"  
  2.   
  3. extern"C" CLASS_DECLSPEC IUnknowService* Create();  
  4.   
  5. IUnknowService* Create()  
  6. {  
  7.     IUnknowService* _interface = static_cast<IPerson*>(new CTeacher);  
  8.     _interface->Add();  
  9.     return _interface;  
  10. }  


在另一個(gè)工程中包含接口頭文件 IUnknowService.cpp,包含對(duì)應(yīng)生成的DLL和.lib

DLL的導(dǎo)入:main.cpp

  1. #include<iostream>  
  2. #include"IUnknowService.h"  
  3. using namespace std;  
  4.   
  5. #pragma comment(lib,"Com.lib")  
  6. extern"C" CLASS_DECLSPEC IUnknowService* Create();  
  7.   
  8. void main()  
  9. {  
  10.     IUnknowService *obj = Create();  
  11.     IPerson* person1 = NULL;  
  12.     IBook*   book1 = NULL;  
  13.     obj->QueryInterface("Person",(void**)&person1);  
  14.     person1->Eat();  
  15.     obj->QueryInterface("Book",(void**)&book1);  
  16.     book1->Read();  
  17.     person1->Release();  
  18.     book1->Release();  
  19.     obj->Release();  
  20. }  

這里說明一下QueryInterface的第二個(gè)參數(shù) void**ppv,我們調(diào)用QueryInterface("Person",(void**)&person1)是可知這里相當(dāng)于ppv=&person1,也就是ppv指向了person1。因此*ppv就成了person,void**ppv成了 void *person。

好的,到此這個(gè)COM結(jié)構(gòu)思想簡(jiǎn)單實(shí)現(xiàn)DLL接口已經(jīng)結(jié)束了,下面是輸出的結(jié)果:

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多