C 呼叫ATL事件連線點

2021-06-19 21:17:23 字數 2440 閱讀 4549

在呼叫者工程中,需要增加「接收器」物件,新增一般的c++類物件,從idispatch 派生,然後完成繼承的虛函式,如建立

csink類,繼承自idispatch ,完成******16庫中觸發事件的接收器。

// 標頭檔案

#pragma once

#include "oaidl.h"

class csink :

public idispatch ;

// cpp檔案

#include "stdafx.h"

#include "sink.h"

csink::csink(void)

csink::~csink(void)

// stdmethodimp 是巨集,等價於 long __stdcall

stdmethodimp csink::queryinte***ce(const struct _guid &iid,void ** ppv)

ulong __stdcall csink::addref(void)

// 做個假的就可以,因為反正這個物件在程式結束前是不會退出的

ulong __stdcall csink::release(void)

// 做個假的就可以,因為反正這個物件在程式結束前是不會退出的

stdmethodimp csink::gettypeinfocount(unsigned int *)

// 不用實現,反正也不用

stdmethodimp csink::gettypeinfo(unsigned int,unsigned long,struct itypeinfo ** )

// 不用實現,反正也不用

stdmethodimp csink::getidsofnames(const iid &,lpolestr *,uint,lcid,dispid *)

// 不用實現,反正也不用

stdmethodimp csink::invoke(

long dispid,

const struct _guid &,

unsigned long,

unsigned short,

struct tagdispparams * pparams,

struct tagvariant *,

struct tagexcepinfo *,

unsigned int *)

// else

break;

case 2:

break;

default:

afxmessagebox( _t("怎麼可能,根本就沒有這個號碼的函式呀") );

break; }

return s_ok; }

假設是基於對話方塊的mfc應用程式,可以在dlg中的標頭檔案中做如下定義:

// 接收器物件

csink m_sink;

// 元件介面指標

// 採用import dll方式引入庫時由於使用了命名空間,所以在使用庫中的介面或物件時需要加入庫的名稱和::(******16lib::)

// 二採用import tlb no_namespace方式引入庫時,不需要使用命名空間

/*******16lib::*/idispconnectptr m_spobj;

// 連線點指標

ccomqiptrm_spcp;

// 連線點的cookie

dword m_dwcookie;

// 在cpp文中的可以使用如下**建立物件

m_dwcookie = 0;

hresult hr = m_spobj.createinstance(_t("******16.dispconnect"));

if (failed(hr))

// 得到連線點容器介面

ccomqiptrspcontainer(m_spobj);

if (!spcontainer)

// 得到連線點

spcontainer->findconnectionpoint(__uuidof(/*******16lib::*/_idispconnectevents), &m_spcp);

if (!m_spcp)

/* 第二個連線點

spcontainer->findconnectionpoint(__uuidof(/*******16lib::*/_idispconnectevents2), &m_spcptime);

if (!m_spcptime) */

// 連線

hr = m_spcp->advise(&m_sink, &m_dwcookie);

if (failed(hr)) /*

hr = m_spcptime->advise(&m_sinktime, &m_dwcookietime);

if (failed(hr))

*/在需要斷開連線的地方使用:

if (m_spcp)

c 反射呼叫事件

這裡有個例子 這個例子反射呼叫的是靜態的action。這裡最後寫了三點需要注意的,我覺得很對。委託其實是個字段,要用getfield來獲取 這裡的第乙個答案。stackoverflow裡的,這個就是反射呼叫事件。主要差別在反射的篩選條件 typeof myclass getfields bindin...

C 反射呼叫私有事件

假設有 a 類的 定義了乙個私有的事件 class aremove 通過反射可以拿到 a 的事件 fx 但是無法直接新增事件 var eventinfo typeof a getevent fx bindingflags.instance bindingflags.nonpublic 如果這時直接呼...

C 中事件的動態呼叫

今天遇到乙個問題,就是希望能夠動態呼叫事件。傳統的思路是,通過reflection.eventinfo獲得事件的資訊,然後使用getraisemethod方法獲得事件被觸發後呼叫的方法,再使用methodinfo.invoke來呼叫以實現事件的動態呼叫。很不幸,reflection.eventinf...