<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1029) 評論(0)  編輯  收藏 所屬分類: C++

    常用鏈接

    留言簿(21)

    隨筆分類(265)

    隨筆檔案(242)

    相冊

    JAVA網站

    關注的Blog

    搜索

    •  

    積分與排名

    • 積分 - 914507
    • 排名 - 40

    最新評論

    主站蜘蛛池模板: 亚洲福利视频一区| 久久国产亚洲电影天堂| 97久久国产亚洲精品超碰热| 毛片无码免费无码播放| 亚洲av无码精品网站| 久久国产乱子免费精品| 亚洲AV永久精品爱情岛论坛| 成人久久免费网站| 亚洲AV成人精品网站在线播放| 99爱在线精品视频免费观看9 | 亚洲福利精品一区二区三区| 国产成人高清亚洲一区久久| 国产伦一区二区三区免费| 日韩久久无码免费毛片软件| 国产美女亚洲精品久久久综合| 91成人免费观看在线观看| 亚洲日韩v无码中文字幕| 日本免费电影一区二区| 亚洲日韩乱码久久久久久| 成年人免费视频观看| 黄网站色视频免费观看45分钟| 亚洲美女高清一区二区三区| a级毛片无码免费真人久久| 亚洲天堂久久精品| 成人最新午夜免费视频| 亚洲av日韩av永久无码电影| 亚洲精品无码激情AV| 免费无码又爽又刺激高潮视频| 亚洲人成网国产最新在线| 免费在线观看亚洲| 久久国产乱子伦精品免费一| 亚洲乱码一二三四区麻豆| 免费中文字幕一级毛片| 免费观看在线禁片| 亚洲av无码专区在线电影天堂 | 最近免费中文字幕大全免费版视频| 天天爽亚洲中文字幕| 亚洲国产主播精品极品网红| 67pao强力打造高清免费| 亚洲1区2区3区精华液| 久久精品亚洲综合专区|