青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-60  評論-262  文章-1  trackbacks-0
當年俺為了實現(xiàn)一個連接點接收器, 死了俺太多腦細胞. 今天重新看這一部分內容, 實現(xiàn)了一個模板, 使用相當簡單, 它使用 ATL 的實現(xiàn).

以下是這個代碼的頭文件 "sinkimpl.h"

#if !defined( __sinkimpl_h_INCLUDED__ )
#define __sinkimpl_h_INCLUDED__ 

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


template
<typename T, typename EventInterface, const GUID * evtLibID=NULL >
class ATL_NO_VTABLE CSinkImpT 
    : 
public CComObjectRootEx<CComSingleThreadModel>
    , 
public CComCoClass<CSinkImpT<T, EventInterface, evtLibID>&__uuidof(T)>
    , 
public IDispatchImpl<EventInterface, &__uuidof(EventInterface), evtLibID>
{
public:
    CSinkImpT(){}
    
virtual ~CSinkImpT(){}

    typedef IDispatchImpl
<EventInterface, &__uuidof(EventInterface), evtLibID> _parentClass;
    typedef CSinkImpT
<T, EventInterface, evtLibID> _thisClass;

    STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
        LCID lcid, WORD wFlags, DISPPARAMS
* pdispparams, VARIANT* pvarResult,
        EXCEPINFO
* pexcepinfo, UINT* puArgErr)
    {
        T 
* pThis = static_cast<*>(this);
        
return pThis->DoInvoke(dispidMember, riid,
            lcid, wFlags, pdispparams, pvarResult,
            pexcepinfo, puArgErr);
    }

    DECLARE_NO_REGISTRY()

    DECLARE_PROTECT_FINAL_CONSTRUCT()

    BEGIN_COM_MAP(_thisClass)
        COM_INTERFACE_ENTRY(IDispatch)
        COM_INTERFACE_ENTRY(EventInterface)
    END_COM_MAP();

    STDMETHOD(DoInvoke)(DISPID dispidMember, REFIID riid,
        LCID lcid, WORD wFlags, DISPPARAMS
* pdispparams, VARIANT* pvarResult,
        EXCEPINFO
* pexcepinfo, UINT* puArgErr)
    {
        
return _parentClass::Invoke(dispidMember, riid,
            lcid, wFlags, pdispparams, pvarResult,
            pexcepinfo, puArgErr);
    }
};

inline HRESULT WINAPI GetConnectPoint(IUnknown 
* pItf, const IID & rSinkIID, IConnectionPoint ** ppCP)
{
    HRESULT hr 
= E_FAIL;
    
do 
    {
        
if (pItf==NULL || ppCP==NULL) { break; }

        CComQIPtr
<IConnectionPointContainer> spContainer; 
        hr 
= pItf->QueryInterface(&spContainer);
        
if (FAILED(hr)) { break; }

        hr 
= spContainer->FindConnectionPoint(rSinkIID, ppCP);
    } 
while (FALSE);
    
return hr;
}

#endif // !defined( __sinkimpl_h_INCLUDED__ )

將上述內容保存為 "sinkimpl.h" 頭文件. 然后將這個頭文件包含在 stdafx.h 靠下一點的地方. 然后就可以使用這個類模板 CSinkImpT 了.
來來來, 咱定義一個例子, 用 oleview.exe 查看我們要實現(xiàn)的針對某一事件的類定義:

可以看到, 事件接口 _GoRiDiEvents 有一個事件 Dead 序號是 1, 據(jù)此我們寫下如下實現(xiàn)代碼.
#pragma once

// 1. define my sink class' CLSID, it's must!!! 
class DECLSPEC_UUID("492194D9-7BEE-422D-AE7C-C43A809F20EC") CSink3;

// 2. define my sink class, it is derived from class template CSinkImpT
class ATL_NO_VTABLE CSink3
    : 
public CSinkImpT<CSink3, _IGoRiDiEvents/*, &__uuidof(__LIANJIEDIANLib)*/>
{
public:
    CSink3(
void){ m_pMain=NULL; }
    
virtual ~CSink3(void){}

    typedef CSinkImpT
<CSink3, _IGoRiDiEvents/*, &__uuidof(__LIANJIEDIANLib)*/> _parentClass; 

    STDMETHOD(DoInvoke)(DISPID dispidMember, REFIID riid,
        LCID lcid, WORD wFlags, DISPPARAMS
* pdispparams, VARIANT* pvarResult,
        EXCEPINFO
* pexcepinfo, UINT* puArgErr)
    {
        
// 3. the dispidMember must referenced from .thl file, and you can have a look using oleview.exe
        switch(dispidMember)
        {
        
case 1
            
if( m_pMain ){
                ::MessageBoxW(m_pMain, pdispparams
->rgvarg[0].bstrVal, L"Sink Message", MB_OK);
            }
            
return S_OK;
        
default:
            
break;
        }
        
return _parentClass::DoInvoke(dispidMember, riid,
            lcid, wFlags, pdispparams, pvarResult,
            pexcepinfo, puArgErr);
    }

    HWND m_pMain;
    
void SetOwner(HWND pDlg) {
        m_pMain 
= pDlg;
    }
};

將以上內容保存為 sink3.h 文件. 就可以在你需要的地方使用這個接收器了. 接收器的使用相當簡便:
{
    HRESULT hr 
= E_FAIL;
    
do 
    {
        
if (m_spGoridi==NULL || m_dwCookie!=0) { break; }

        CComQIPtr
<IConnectionPoint> spCP;
        hr 
= GetConnectPoint(m_spGoridi, __uuidof(_IGoRiDiEvents), &spCP);
        
if (FAILED(hr)){ break; }

        CComQIPtr
<IDispatch> spSink;
        {
            CComObject
<CSink3> * pTmp = NULL;
            hr 
= CComObject<CSink3>::CreateInstance(&pTmp);
            
if (FAILED(hr)){ break; }

            pTmp
->SetOwner(m_hWnd);

            pTmp
->AddRef();
            hr 
= pTmp->QueryInterface(&spSink);
            pTmp
->Release();

            
if (FAILED(hr)){ break; }
        }

        spCP
->Advise(spSink, &m_dwCookie); 

    } 
while (FALSE);
}

至此, 可以接收事件了, 注意, 記下 m_dwCookie 值. 到某個時候, 我們不想接收事件了, 可以像這樣取消掉它:
{
    HRESULT hr 
= E_FAIL;
    
do {
        
if (m_dwCookie==0) { break; }

        CComQIPtr
<IConnectionPoint> spCP;

        hr 
= GetConnectPoint(m_spGoridi, __uuidof(_IGoRiDiEvents), &spCP); 
        
if (FAILED(hr)){ break; }

        hr 
= spCP->Unadvise(m_dwCookie);
        m_dwCookie 
= 0
    } 
while (FALSE);
}

上面的兩段代碼用到了變量 m_spGoridi, 其定義和實例化為:

CComPtr<LIANJIEDIANLib::IGoRiDi> m_spGoridi;
m_spGoridi.CoCreateInstance(__uuidof(LIANJIEDIANLib::GoRiDi));
 

 

 

以上實現(xiàn)的例子代碼在此:
http://m.shnenglu.com/Files/free2000fly/atlsink.zip

關于實現(xiàn)能響應事件的組件的文章, 網上已經很多了, 這里就是一篇:
http://blog.vckbase.com/teacheryang/archive/2005/09/21/12224.html


PS, 敲完才發(fā)現(xiàn), 以上文章的代碼要作點小修改:
template<typename T, typename EventInterface, const GUID & evtLibID >
要改成
template<typename T, typename EventInterface, const GUID * evtLibID=NULL >
才能在 VC6 下編譯通過, 因為 vc6 的C++ 實現(xiàn)不支持模板參數(shù)是引用, 其它地方也必須做相應修正. 供下載用的 zip 文件里已經修正了.
posted on 2009-05-28 18:21 free2000fly 閱讀(4278) 評論(1)  編輯 收藏 引用

評論:
# re: 一個標準的 COM 連接點接收器(Sink)的實現(xiàn), 使用相當簡單!!! 2009-07-20 11:47 | free2000fly
引入類型庫的語句

#import "libid:f9152aec-3462-4632-8087-eee3c3cdda35" \
raw_interfaces_only \
no_smart_pointers \
raw_dispinterfaces \
raw_native_types \
no_implementation
  回復  更多評論
  

只有注冊用戶登錄后才能發(fā)表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美/亚洲一区| 亚洲网站在线| 欧美激情一区二区久久久| 久久蜜桃资源一区二区老牛 | 欧美一区二区三区久久精品茉莉花| 欧美激情在线观看| 午夜免费日韩视频| 久久久国产精品亚洲一区| 久久频这里精品99香蕉| 亚洲大胆av| 夜夜狂射影院欧美极品| 欧美一区二区三区成人| 欧美91视频| 国产精品女人网站| 在线观看欧美精品| 亚洲一区二区精品在线观看| 久久激情五月丁香伊人| 亚洲高清色综合| 性欧美大战久久久久久久久| 免费成人高清| 国产精品久久毛片a| 在线免费一区三区| 午夜精品久久| 最新中文字幕亚洲| 欧美亚洲一区二区三区| 欧美理论在线播放| 国内精品视频在线观看| 一区二区三区欧美亚洲| 久久亚洲国产成人| av不卡免费看| 欧美大片一区二区| 国产午夜亚洲精品理论片色戒| 亚洲精品自在在线观看| 久久精品在线免费观看| 亚洲美女少妇无套啪啪呻吟| 久久成人久久爱| 国产精品乱看| 99re视频这里只有精品| 久久久精品一品道一区| 一区二区三区精品| 欧美成人a∨高清免费观看| 国产亚洲在线| 亚洲欧美伊人| 日韩亚洲欧美成人| 欧美激情视频在线播放| 在线观看欧美黄色| 久久久久五月天| 亚洲自拍偷拍网址| 欧美视频免费看| 99精品99| 亚洲伦理精品| 欧美精品 国产精品| 18成人免费观看视频| 久久精品国产91精品亚洲| 一区二区三欧美| 欧美日韩精品二区| 99在线精品视频| 欧美黄色一级视频| 久久久久久久久综合| 韩国一区电影| 久久综合九色九九| 久久久久久综合| 国产综合色在线视频区| 国产精品免费一区二区三区在线观看| 欧美h视频在线| 亚洲国内精品| 亚洲国产天堂久久国产91| 欧美成人在线影院| 99综合精品| 一级成人国产| 国产精品中文字幕欧美| 亚欧成人在线| 亚洲在线免费观看| 国产午夜精品久久久| 久久久久欧美精品| 六月婷婷久久| 99精品热视频只有精品10| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久精品国产精品| 欧美制服丝袜第一页| 伊人久久综合97精品| 欧美电影在线观看完整版| 欧美激情综合在线| 午夜久久福利| 久久久999精品免费| 亚洲日本一区二区| 中文日韩在线| 狠狠色综合网| 亚洲精品中文字幕在线| 国产精品一级在线| 欧美福利小视频| 国产精品伦子伦免费视频| 久久不射网站| 欧美大成色www永久网站婷| 亚洲自拍偷拍视频| 久久人体大胆视频| 亚洲视频在线观看免费| 欧美一区二区三区婷婷月色 | 亚洲国产日韩欧美综合久久 | 久久婷婷色综合| 亚洲一区二区免费| 久久婷婷一区| 亚洲一区二区三区涩| 久久久精品一区二区三区| 一区二区三区产品免费精品久久75 | 欧美日韩中文在线观看| 久久综合九色综合欧美就去吻 | 午夜精品久久久久久久久久久久久| 久久久久国产精品厨房| 亚洲理论电影网| 国内免费精品永久在线视频| 亚洲免费观看在线视频| 国产在线一区二区三区四区 | 久久精品人人| 午夜精品久久久久久| 欧美成人一区二区| 久久性色av| 国产精品免费视频观看| 亚洲人成网站精品片在线观看| 国产一区二区中文| 在线一区二区三区四区五区| 91久久国产自产拍夜夜嗨| 亚洲小说春色综合另类电影| 99国产精品一区| 免费欧美在线视频| 老色鬼精品视频在线观看播放| 国产精品久久久久久久久| 亚洲日本va在线观看| 亚洲国内精品在线| 久久久精彩视频| 久久九九热免费视频| 久久免费精品视频| 久久久久久亚洲综合影院红桃| 国产精品入口日韩视频大尺度| 亚洲精品在线视频观看| 日韩网站在线看片你懂的| 麻豆九一精品爱看视频在线观看免费| 久久久久中文| 激情久久五月| 久久一区二区三区四区| 裸体丰满少妇做受久久99精品| 国精品一区二区三区| 性色一区二区| 久久一区二区三区国产精品| 国内一区二区在线视频观看| 欧美在线精品一区| 久久欧美肥婆一二区| 国外成人在线视频| 久久黄色级2电影| 久久婷婷国产综合尤物精品| 激情自拍一区| 美女精品在线观看| 亚洲国产另类久久精品| 99精品久久| 国产精品综合色区在线观看| 亚洲男人第一av网站| 久久av在线看| 精品动漫av| 欧美激情免费在线| 一区二区三区蜜桃网| 欧美一级免费视频| 精品69视频一区二区三区| 久热精品视频在线免费观看| 91久久精品美女高潮| 亚洲午夜视频在线观看| 国产九九精品| 久久亚洲私人国产精品va媚药| 亚洲国产精品久久久| 亚洲一区二区三区成人在线视频精品| 国产精品国产三级欧美二区 | 欧美一区二区三区男人的天堂| 欧美日韩成人在线视频| 美女国内精品自产拍在线播放| 亚洲成人在线观看视频| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲国产裸拍裸体视频在线观看乱了中文| 一本色道久久综合亚洲精品按摩 | 久久国产日韩| 亚洲精品免费在线观看| 国产精品一区二区你懂得| 久久一区二区三区超碰国产精品| 亚洲精品在线视频| 久久婷婷久久| 午夜精品免费| 亚洲免费精品| 黑人巨大精品欧美一区二区小视频| 欧美大片91| 久久精品国产第一区二区三区最新章节 | 亚洲欧美日韩精品在线| 欧美高清影院| 欧美一区二区三区在线观看视频| 亚洲福利在线视频| 国产精品一区毛片| 欧美精品电影在线| 久久久久久久成人| 亚洲国产成人精品久久久国产成人一区| 亚洲裸体视频| 在线播放日韩专区| 国产麻豆综合| 国产精品乱码久久久久久|