乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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)論公約

        類似文章 更多