C ++中的Word插件,IDTExtensibility2,如何为事件编写处理程序? (通用COM帮助也是如此)

时间:2013-09-01 23:14:44

标签: c++ com ms-office add-in visual-studio-addins

我正在寻找可用的原生Word插件的极少数样本,试图找到重建VSTO的Document.OnBeforeClose事件的方法。

目前,我发现IDTExtensibility2引用了DTEDTE是与Visual Studio扩展相同的基于COM的方法。(so如果我找到一个有效的C ++ - 使用相同类型的钩子编写VS加载项,它将快速解决我的问题。

这取自2000年的TestAddin2样本:

    BEGIN_COM_MAP(CConnect)
            COM_INTERFACE_ENTRY2(IDispatch, IRibbonCallback)
            COM_INTERFACE_ENTRY(IConnect)           
            COM_INTERFACE_ENTRY(_IDTExtensibility2)
            COM_INTERFACE_ENTRY(_FormRegionStartup)
            COM_INTERFACE_ENTRY(IRibbonExtensibility)
            COM_INTERFACE_ENTRY(IRibbonCallback)
    END_COM_MAP()

所以目前我想知道:

  • 如何从Word中获取正确的ENTRY *参数以捕获文档级事件?
  • 应该实现哪些接口来支持它?
  • 如何在纯C ++ COM中正确实现回调函数(在VSTO中作为'handlers'传递给com对象的函数)?
  • 是否有任何东西可以从现有COM对象生成标题,就像VS在显示COM对象字段/ props时一样?

似乎至少SO上的某个人设法写了一个本机代码插件(packaging a COM addin for deployment),所以我真的希望得到帮助。

1 个答案:

答案 0 :(得分:1)

下面是一个示例,说明如何使用ATL的IDispEventImpl/BEGIN_SINK_MAP/SINK_ENTRY_EX/END_SINK_MAP实现COM调度接口的事件处理程序:

http://support.microsoft.com/kb/194179

要为MS Word和Office对象模型生成COM定义,您需要以下文件:

MSADDNDR.TLB
MSO.DLL
MSWORD.OLB
VBE6EXT.OLB

您应该能够在“C:\ Program Files(x86)\ Microsoft Office \”下的某处找到它们。以下导入代码不久前使用Office 2007,您可能需要针对更新的Office版本进行调整:

#import "TypeLib\MSADDNDR.TLB" \
    raw_interfaces_only \
    no_namespace \
    auto_search 

#import "TypeLib\MSWORD.OLB" \
    raw_interfaces_only \
    rename("ExitWindows","MsoExitWindows") \
    rename("FindText","MsoFindText") \
    rename("DocumentProperties", "MsoDocumentProperties") \
    rename("RGB", "MsoRGB") \
    auto_search \
    exclude("IAccessible", "AddIn", "Adjustments")