我潜伏在极少数可用的 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/