小编rim*_*ono的帖子

如何侦听独立启动的Office应用程序中的COM事件?

我想做的事:

编写一个监听Office事件的应用程序。我想从计算机上打开的任何实例中监听事件。例如,如果我在Word中收听BeforeDocumentSave,那么只要主机上任何Word实例保存文档,我都希望激活此方法的接收器。

另一个要求是,我要用C ++编写而不使用MFC或ATL。

我所做的:

我已经编写了一个程序来监听Word事件。请参见下面的代码。

问题:

它不起作用-尽管我打开了Word应用程序并执行了应触发事件的操作,但从未输入事件处理程序。

我有一些具体的问题,当然,任何其他意见都将受到欢迎!

问题:

  1. 是否可以侦听不是由我启动的应用程序中的事件?在我发现的所有示例中,侦听应用程序都会启动要侦听的Office应用程序。

  2. 在Microsoft howto(http://support.microsoft.com/kb/183599/EN-US/)中,我发现以下注释:

但是,大多数事件(例如Microsoft Excel的Workbook事件)并非以DISPID 1开头。在这种情况下,必须在MyEventSink.cpp中显式修改分派映射,以使DISPID与正确的方法匹配。

如何修改调度图?

  1. 现在,我仅定义了Startup,Quit和DocumentChange,它们不带任何参数。我真正需要的方法确实带有参数,特别是Document类型之一。如果不使用MFC,如何定义此类型的参数?

码:

这是我的项目的头文件,后跟C文件:

#ifndef _OFFICEEVENTHANDLER_H_
#define _OFFICEEVENTHANDLER_H_

// 000209FE-0000-0000-C000-000000000046
static const GUID IID_IApplicationEvents2 =  
{0x000209FE,0x0000,0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};

struct IApplicationEvents2 : public IDispatch // Pretty much copied from typelib
{
/*
 * IDispatch methods
 */
STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj) = 0; 
STDMETHODIMP_(ULONG) AddRef()  = 0;  
STDMETHODIMP_(ULONG) Release() = 0;

STDMETHODIMP GetTypeInfoCount(UINT *iTInfo) = 0;
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) = 0; …
Run Code Online (Sandbox Code Playgroud)

c++ com events ms-office

5
推荐指数
1
解决办法
3372
查看次数

标签 统计

c++ ×1

com ×1

events ×1

ms-office ×1