Excel Automation-使用FindConnectionPoint过滤com事件
Excel Automation - Filter COM events using FindConnectionPoint
i使用C com收听现有Excel应用程序的事件IID_APPLICATIONEVENTS。我的代码放在单独的EXE文件中。连接点以以下代码初始化:
IConnectionPointContainer* pCPC = NULL;
hr = pEventSource->QueryInterface(IID_IConnectionPointContainer,
(void**)&pCPC);
if (SUCCEEDED(hr)){
hr = pCPC->FindConnectionPoint(IID_ApplicationEvents, &m_pConnectionPoint);
if (SUCCEEDED(hr)){
hr = m_pConnectionPoint->Advise(this, &m_dwConnection);
if (FAILED(hr))
LOG_ERROR(L"m_pConnectionPoint->Advise - FAIL");
}
else
LOG_ERROR(L"FindConnectionPoint - IID_ApplicationEvents: FAIL");
pCPC->Release();
}
else
LOG_ERROR(L"IID_IConnectionPointContainer: FAIL");
return hr;
我正在通过Invoke函数接收Excel事件:
STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS* pDispParams,
VARIANT* pVarResult, EXCEPINFO* pExcepInfo,
UINT* puArgErr)
我的问题如下:为了提高我的应用程序的性能,而不是放慢excel的速度,我只对OnBeforesave和Onclose事件感兴趣。有没有一种方法可以过滤我的过程中的其他Excel事件(我不希望调用我的调用函数)?
正如上面注释中提到的igor,您不能简单地过滤事件。但是,您可以自己构建一些事情来做到这一点。
这是一种方法:
- 创建将加载在Excel过程中的COM加载项。(请参阅
IDTExtensibility2
)。 - 当调用
OnConnection
时:- 创建您自己的本土事件过滤类的实例(实现
IDispatch
来处理事件和IConnectionPointContainer
以提高事件)。 - 使事件过滤对象"公开"通过将其
IUnknown
指针分配给Object
属性的AddIn
对象的属性,该属性作为AddInIst
参数为OnConnection
。
- 创建您自己的本土事件过滤类的实例(实现
- 当您的事件过滤器对象接收事件时,请根据规则过滤。如果事件未过滤,请从过滤器对象提出。
- 在您的外部过程中,在
AddIns2
集合中找到COM加载项,然后阅读其Object
属性。然后,您可以将其视为事件源,而不是Application
对象。
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 处理闪烁窗口事件
- COM 事件需要 C3702 atl
- 将 COM 事件从 C# 触发到C++的正确方法是什么?
- Excel Automation-使用FindConnectionPoint过滤com事件
- 使用 C++向 COM 公开托管事件
- 识别与 Windows USB 虚拟 COM 端口的连接事件
- Reg Free进程外COM服务器事件
- 如何在c++中激发c#COM事件
- 在C++Builder中有COM事件处理的工作示例吗
- COM事件处理的最快方式(就性能而言)
- COM c++中的自定义事件处理
- 如何在QT中处理c# COM事件
- 如何实现C++COM事件处理的接收器
- 触发 COM 事件时 Lock()/Unlock() 调用的目的是什么?
- 用c++ (ATL, MFC或纯c++)处理COM事件,实现Java互操作