c++ - C++ 中的 Word 插件,IDTEXtensibility2,如何编写事件处理程序? (也需要通用 COM 帮助)

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

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

目前,我发现 IDTExtensibility2 引用了 DTE,并且 DTE 与用于 Visual 的基于 COM 的方法相同Studio 扩展..(因此,如果我能找到一个可用的 C++ 编写的具有相同类型 Hook 的 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()

所以目前我想知道:

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

看来至少有人成功编写了一个 native 代码插件( packaging a COM addin for deployment ),所以我真的很期待这里的帮助。

最佳答案

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

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

关于c++ - C++ 中的 Word 插件,IDTEXtensibility2,如何编写事件处理程序? (也需要通用 COM 帮助),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18563833/

相关文章:

c++ - string::find() c++ 使用的字符串搜索算法

c++ - 如何在运行时使用 GoogleMock 在 C++ 单元测试中模拟系统调用?

c++ - 检查字符串字符和长度

c# - 在 C# 中访问 WindowsInstaller.Installer COM 对象

c++ - HRESULT "Class Not Registered"实现简单的 COM 服务器 DLL

c# - Excel 2010 com 对象引用未发布

c# - MS Word,使用 NPOI 库

excel - 如果 MS excel 中的单元格值为空或为零,则创建一个删除特定单元格并向上移动行的按钮

c++ - 狮身人面像 : Correct way to document an enum?

javascript - 在 Word 桌面客户端中,是否有正确的方法从 Javascript Api for Office 保存文档?