1.組件中必須有3個函數,QueryInterfaceAddRefRelease,它們3個函數也組成一個接口,叫"IUnknown"

          2.組件API及接口指針中,除了IUnknown::AddRef()IUnknown::Release()兩個函數外,其它所有的函數,都以 HRESULT 作為返回值。

          3.原則:COM 組件是運行在分布式環境中的通俗地說,你不能直接把一個內存指針直接作為參數傳遞給COM函數。

          4.結果判斷一般用VC提供的宏:

          HRESULT hr = 調用組件函數;

          if( SUCCEEDED( hr ) ){...} // 如果成功

          if( FAILED( hr ) ){...} // 如果失敗

          5.Browser Helper Objects,我譯為"瀏覽器幫助者對象",以下皆簡稱BHO


          ==================================

          如果感覺不清楚,請先參看com組件應用(1),因為范例是從上例中改造過來的。


          還是用具體范例來講:computer_def.h

          #include <Unknwn.h>

          #define UUID_ICOMPUTER __declspec( uuid( "9DC95DDC-FF98-4afe-B17E-42F028E34F68" ) )
          class UUID_ICOMPUTER Icomputer: public IUnknown
          {
          public:
              
          virtual int add(int a, int b ) = 0;    
          };


          #define UUID_ICOMPUTEREX __declspec( uuid( "3B8BF613-7AF1-4672-9EC3-E5DC49A6E8D9" ) )
          class UUID_ICOMPUTEREX IcomputerEx: public IUnknown
          {
          public:
              
          virtual int sub(int a, int b ) = 0;    
          };

          實現類:

          class Ccomputer : 
              
          public Icomputer,
              
          public IcomputerEx

          {
          public:
              
          virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
                  
          /* [in] */ REFIID riid,
                  
          /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
              {
                  
          if(riid == __uuidof(Icomputer))
                  {
                      
          *ppvObject = (Icomputer*)(this);
                  }

                  
          else if(riid == __uuidof(IcomputerEx))
                  {
                      
          *ppvObject = (IcomputerEx*)(this);
                  }

                  
          return S_OK;
              }

              
          virtual ULONG STDMETHODCALLTYPE AddRef( void)
              {
                  m_nRef
          ++;
                  
          return m_nRef;
              }

              
          virtual ULONG STDMETHODCALLTYPE Release( void)
              {
                  m_nRef
          --;

                  
          if(0 == m_nRef)
                  {
                      delete 
          this;
                  }

                  
          return 0;
              }

              
          virtual int add(int a, int b)
              {
                  
          return a + b;
              }
              
          virtual int sub(int a,  int b)
              {

                  
          return a - b;
              }
          private:
              ULONG m_nRef;

          };

          使用上:

          Icomputer *pComputer;

            IcomputerEx 
          *pComputerEx;

            HMODULE hDll 
          = ::LoadLibrary(TEXT("computer.dll"));
            
            typedef HRESULT (__stdcall 
          *PFN_DllGetClassObject)(Icomputer** ppv);

            PFN_DllGetClassObject pDllGetClassObject 
          = (PFN_DllGetClassObject)::GetProcAddress(hDll, "DllGetClassObject");
            
            
          if(NULL == pDllGetClassObject)
            {
             
          //nRet = STATUS_SEVERITY_ERROR;
            }

            
          // 創建接口
            HRESULT hRet = pDllGetClassObject(&pComputer);
            
            
          if(FAILED(hRet))
            {
             
          //nRet = STATUS_SEVERITY_ERROR;
            }


          ……



           
          int iRet = pComputer->add(iNum_1,iNum_2);
             
             pComputer
          ->QueryInterface(__uuidof(IcomputerEx),(void**)&pComputerEx);

             
          //pComputerEx = (pComputerEx)(pC);

             iRet 
          = pComputerEx->sub(iNum_1,iNum_2);

           

          闡述總結:繼承IUnknown 接口,實現其中方法。 這樣就可以通過QueryInterface 來查詢接口,并使用其中的函數。

          posted on 2009-08-18 21:27 -274°C 閱讀(1027) 評論(0)  編輯  收藏 所屬分類: C++

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊

          JAVA網站

          關注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 914107
          • 排名 - 40

          最新評論

          主站蜘蛛池模板: 当阳市| 巴南区| 扎赉特旗| 锦屏县| 富顺县| 西林县| 扎兰屯市| 上思县| 迁安市| 颍上县| 郓城县| 贵南县| 民丰县| 南和县| 白山市| 仪征市| 四川省| 清原| 花莲县| 棋牌| 尖扎县| 南充市| 西峡县| 诏安县| 塘沽区| 康马县| 宝兴县| 葫芦岛市| 河间市| 双柏县| 泉州市| 出国| 亳州市| 民乐县| 永兴县| 比如县| 凤台县| 新田县| 元谋县| 凤城市| 平阳县|