2

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

目前,我发现它IDTExtensibility2有一个对 的引用DTE,这DTE与用于 Visual Studio 扩展的基于 COM 的方法相同。(因此,如果我找到一个具有相同钩子的 C++ 编写的 VS 加载项,它会很快解决我的问题。

这是取自TestAddin22000 年代的样本:

    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()

所以目前我想知道:

  • 如何获取正确的 ENTRY* 参数以从 Word 中捕获文档级事件?
  • 应该实现什么接口来支持它?
  • 如何在纯 C++ COM 中正确实现回调函数(在 VSTO 中作为“处理程序”传递给 com 对象的函数)?
  • 是否有任何东西可以从现有的 COM 对象生成标题,就像 VS 在显示 COM 对象字段/道具时所做的那样?

似乎 SO 上至少有人设法编写了本机代码插件(打包 COM 插件以进行部署),所以我真的很期待这里的帮助。

4

1 回答 1

2

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

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") 
于 2013-09-02T00:24:26.493 回答