如何在C#中處理COM中定義的通知


如何在C#中處理COM中定義的通知
C++寫法:
STDMETHODCALLTYPE   Advise(  
                        /*   [in]   */   IUnknown   *pUnkSink,
                        /*   [out]   */   DWORD   *pdwCookie)   =   0                        
C#寫法:  
我想用接口   IAdviseSink來實現同樣的功能?
-------------------------------------------------------------------------------------  
附今天才寫的C#代碼:          
                        Guid   CLSID_TCSUser   =   new   Guid("4B39D001-6F7B-11d5-8CA0-00A0245AE65C");
                        Guid[]   iids   =   {   new   Guid("4B39D002-6F7B-11d5-8CA0-00A0245AE65C"),   new   Guid("4B39D005-6F7B-11d5-8CA0-00A0245AE65C")   };
                   
                          MULTI_QI[]   amqi   =   ole32Ex.CoCreateInstanceEx(CLSID_TCSUser,
                          ClsCtx.All,   "127.0.0.1",   iids,   RpcAuthent.None,   RpcAuthor.Default,   "",   RpcLevel.Connect,   RpcImpers.Default,   "",   "",   "",true);
                          if   (amqi   !=   null)
                          {
                          //獲取COM對象tt
                          object   tt   =         Marshal.GetObjectForIUnknown(amqi[0].pItf);
                          ITCSUser   iICSUser   =   (ITCSUser)(tt);
                                                    IConnectionPointContainer   cpc   ;
                          //獲取連接點對象
                          IntPtr   ppv;
                          iid_cpc   =   new   Guid("B196B284-BAB4-101A-B69C-00AA00341D07");
                          Marshal.QueryInterface(amqi[0].pItf,   ref   iid_cpc,   out   ppv);
                          cpc   =   (IConnectionPointContainer)(Marshal.GetObjectForIUnknown(   ppv));
                   
                       
                          IConnectionPoint   cpt;
                          //需要處理的DCOM中定義的事件
                          Guid   TCSUserEvents   =   new   Guid("4B39D004-6F7B-11d5-8CA0-00A0245AE65C");
                          cpc.FindConnectionPoint(ref   TCSUserEvents,   out   cpt);
                           
                          eventhandler   =   new   EventHandle();
                          int   cookie   =   0;
                        //寫道這里就進行不下去了。
                          cpt.Advise((object)eventhandler,   out   cookie);


最后一句在C++中是下面這樣寫的:    
                        //   Advise   ITCSUserEvents
        IConnectionPointContainer*     pCPC   =   NULL;
        hr   =   m_pUser-> QueryInterface(IID_IConnectionPointContainer,   (void**)&pCPC);
        _ASSERT(SUCCEEDED(hr));
        hr   =   pCPC-> FindConnectionPoint(__uuidof(ITCSUserEvents),   &m_pITCSUserCP);
_ASSERT(SUCCEEDED(hr));
        pCPC-> Release();
        m_iUserEventsCookie   =   0;
        hr   =   m_pITCSUserCP-> Advise(static_cast <ITCSUserEvents*> (this),   &m_iUserEventsCookie   );  

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com