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

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

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

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

    常用鏈接

    留言簿(21)

    隨筆分類(265)

    隨筆檔案(242)

    相冊

    JAVA網站

    關注的Blog

    搜索

    •  

    積分與排名

    • 積分 - 914374
    • 排名 - 40

    最新評論

    主站蜘蛛池模板: 久久久无码精品亚洲日韩按摩| 国产亚洲人成A在线V网站 | 亚洲精品无码久久毛片| 亚洲av无码无线在线观看| 日韩免费三级电影| 亚洲成a∧人片在线观看无码| 免费观看的毛片手机视频| 亚洲AV无码AV吞精久久| 国产gav成人免费播放视频| 免费在线人人电影网| 亚洲午夜精品第一区二区8050| 久久久久久国产a免费观看不卡 | 日韩免费无码视频一区二区三区| 亚洲人成依人成综合网| 精品无码无人网站免费视频| 亚洲AV成人噜噜无码网站| 四虎影视大全免费入口| 黄色一级视频免费| 国产亚洲一区二区在线观看| jjizz全部免费看片| 亚洲欧好州第一的日产suv| 亚洲国产精品综合久久一线| 青青操免费在线视频| 亚洲国产日韩一区高清在线| 国产成人免费爽爽爽视频| 免费无码又黄又爽又刺激| 狠狠入ady亚洲精品| 亚洲热妇无码AV在线播放| 亚洲免费在线观看视频| 另类图片亚洲校园小说区| 亚洲不卡av不卡一区二区| 国产福利在线免费| 一级毛片试看60分钟免费播放| 亚洲丝袜美腿视频| 国产性生交xxxxx免费| 久久精品私人影院免费看| 亚洲性色精品一区二区在线| 伊人久久大香线蕉亚洲| 免费三级毛片电影片| 中文在线观看国语高清免费| 亚洲18在线天美|