1.組件中必須有3個函數,QueryInterface、AddRef、Release,它們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 閱讀(1035) 評論(0)  編輯  收藏 所屬分類: C++

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊

          JAVA網站

          關注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 916110
          • 排名 - 40

          最新評論

          主站蜘蛛池模板: 太保市| 滁州市| 舟山市| 满城县| 门源| 贵定县| 镇赉县| 大同市| 三门峡市| 古交市| 阳新县| 河源市| 会宁县| 峨边| 恭城| 酉阳| 呼图壁县| 尉犁县| 和田市| 固原市| 施秉县| 双峰县| 内乡县| 琼海市| 博罗县| 泗阳县| 万全县| 宜君县| 眉山市| 长宁区| 洛川县| 镇江市| 安多县| 界首市| 宜州市| 海伦市| 安远县| 石首市| 郁南县| 岐山县| 门头沟区|