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

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

以下是這個(gè)代碼的頭文件 "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__ )

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

可以看到, 事件接口 _GoRiDiEvents 有一個(gè)事件 Dead 序號(hào)是 1, 據(jù)此我們寫下如下實(shí)現(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;
    }
};

將以上內(nèi)容保存為 sink3.h 文件. 就可以在你需要的地方使用這個(gè)接收器了. 接收器的使用相當(dāng)簡(jiǎn)便:
{
    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 值. 到某個(gè)時(shí)候, 我們不想接收事件了, 可以像這樣取消掉它:
{
    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, 其定義和實(shí)例化為:

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

 

 

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

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


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

評(píng)論:
# re: 一個(gè)標(biāo)準(zhǔn)的 COM 連接點(diǎn)接收器(Sink)的實(shí)現(xiàn), 使用相當(dāng)簡(jiǎn)單!!! 2009-07-20 11:47 | free2000fly
引入類型庫(kù)的語(yǔ)句

#import "libid:f9152aec-3462-4632-8087-eee3c3cdda35" \
raw_interfaces_only \
no_smart_pointers \
raw_dispinterfaces \
raw_native_types \
no_implementation
  回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            精品不卡一区| 性色av一区二区三区| 亚洲精品乱码久久久久久蜜桃麻豆 | 免费视频亚洲| 国产有码一区二区| 亚洲欧美国产日韩天堂区| 亚洲国产91| 久久另类ts人妖一区二区| 国产一区二区三区在线观看视频| 亚洲女性裸体视频| 亚洲午夜电影| 欧美成人资源| 久久久亚洲一区| 精品盗摄一区二区三区| 久久亚洲电影| 久久综合九色综合欧美就去吻 | 亚洲一区二区三| 99re6这里只有精品| 欧美日韩日本国产亚洲在线| 欧美日韩国产精品| 99精品国产99久久久久久福利| 亚洲第一久久影院| 欧美绝品在线观看成人午夜影视| 亚洲毛片一区| 一本色道久久88亚洲综合88| 国产精品视频免费| 久久久亚洲高清| 久久综合九色综合网站| 日韩网站在线观看| 国产精品99久久久久久久久久久久| 欧美日韩一区二区视频在线| 亚洲一级在线观看| 欧美一区二区在线免费播放| 亚洲欧美美女| 国产欧亚日韩视频| 麻豆成人在线观看| 女同一区二区| 亚洲性色视频| 欧美一级视频免费在线观看| 精品粉嫩aⅴ一区二区三区四区| 欧美大片一区二区三区| 欧美精品一区二区三区很污很色的| 亚洲网在线观看| 亚洲午夜精品久久久久久浪潮| 国产亚洲精久久久久久| 亚洲第一在线综合在线| 欧美三级黄美女| 久久精品九九| 欧美久久久久免费| 久久精品五月| 欧美精品在线一区| 久久aⅴ国产欧美74aaa| 麻豆精品在线播放| 亚洲欧美国产三级| 久久亚洲春色中文字幕| 亚洲永久免费av| 麻豆亚洲精品| 欧美一区二区三区四区高清| 欧美激情精品久久久久| 欧美伊人久久| 欧美激情成人在线| 美国成人直播| 亚洲精品免费一二三区| 国产日韩欧美另类| 日韩视频国产视频| 亚洲国产国产亚洲一二三| 亚洲小说区图片区| 亚洲精品视频在线观看免费| 性欧美在线看片a免费观看| 亚洲欧洲一区| 久久九九精品| 香蕉免费一区二区三区在线观看| 欧美大片一区二区| 免费成人黄色| 激情久久综艺| 亚洲在线观看| 国产精品99久久久久久有的能看| 久久久99国产精品免费| 欧美一区日本一区韩国一区| 欧美伦理一区二区| 欧美激情二区三区| 尤物yw午夜国产精品视频明星| 亚洲免费在线视频| 欧美亚洲色图校园春色| 99天天综合性| 亚洲另类一区二区| 美女视频黄a大片欧美| 毛片av中文字幕一区二区| 国产亚洲二区| 欧美一区成人| 久久久www成人免费精品| 国产精品免费区二区三区观看| 亚洲精品欧美精品| 一区二区三区免费看| 欧美日韩小视频| 一区二区不卡在线视频 午夜欧美不卡在 | 国产精品av免费在线观看| 亚洲人在线视频| 日韩视频免费在线| 欧美激情第五页| 亚洲人成在线观看一区二区 | 欧美激情在线免费观看| 精品999在线播放| 久久精品国产精品| 美女视频黄a大片欧美| 亚洲国产高清一区| 欧美成人午夜免费视在线看片| 欧美激情精品久久久久久变态| 亚洲高清一二三区| 欧美精品少妇一区二区三区| 亚洲美女色禁图| 欧美激情一区二区三区在线| 日韩亚洲成人av在线| 亚洲欧美在线aaa| 国产欧美日韩另类视频免费观看| 欧美影片第一页| 欧美丰满高潮xxxx喷水动漫| 一本到高清视频免费精品| 国产精品黄色| 久久se精品一区二区| 欧美国产综合视频| 夜夜夜久久久| 国产精品永久入口久久久| 久久电影一区| 亚洲清纯自拍| 欧美伊人久久| 亚洲精品久久久久久久久久久| 欧美日韩xxxxx| 亚洲综合国产| 欧美激情视频给我| 亚洲欧美日本另类| 在线播放中文一区| 欧美日韩一区在线视频| 欧美在线观看一区| 亚洲日韩欧美视频一区| 欧美影院成人| 99这里有精品| 国产亚洲欧美一区| 欧美另类极品videosbest最新版本| 亚洲一区欧美一区| 欧美大片在线观看| 久久国产婷婷国产香蕉| 亚洲激情一区二区| 国产欧美日韩另类一区| 欧美日韩免费看| 久久综合九色综合网站| 一区二区三区视频免费在线观看| 久久综合伊人77777麻豆| 亚洲一区尤物| 亚洲黄色尤物视频| 国产欧美日本一区二区三区| 欧美日韩国产123| 蜜桃av噜噜一区| 欧美高清成人| 午夜精品99久久免费| 亚洲免费黄色| 在线观看一区欧美| 国产一区二区三区视频在线观看| 欧美日韩综合视频网址| 另类图片国产| 久久精品国产精品亚洲| 午夜精品久久久久久久99樱桃| 亚洲人www| 欧美韩日一区二区| 久久亚洲一区二区| 久久电影一区| 性欧美精品高清| 亚洲欧美一区在线| 亚洲欧美日韩一区二区在线 | 亚洲激情网站免费观看| 国产视频在线观看一区二区| 国产精品地址| 国产精品xxxxx| 欧美日韩国产精品成人| 欧美日本成人| 欧美精品黄色| 欧美激情网站在线观看| 欧美韩日一区二区三区| 久久综合久久综合久久| 欧美在线视频免费播放| 性色av一区二区怡红| 性久久久久久| 欧美中文在线视频| 久久国产综合精品| 久久久久久穴| 麻豆乱码国产一区二区三区| 久热精品视频| 欧美va亚洲va日韩∨a综合色| 老司机精品视频网站| 欧美高清免费| 欧美日韩国产在线播放| 国产精品乱码人人做人人爱| 国产精品视屏| 国内精品一区二区| 亚洲国产影院| 中文国产一区| 久久电影一区| 欧美国产成人精品| 夜夜爽www精品| 欧美在线视频免费播放|