在呼叫者工程中,需要增加「接收器」物件,新增一般的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...