各位,我在ATL开发Word 2003插件的时候,调用
Startup()
DocumentOpen(IDispathch ptr)
等函数的时候没有问题,而调用同样的
DocumentBeforeClose(IDispathch ptr, VARIANT_BOOL * Cancel)
DocumentBeforePrint(IDispathch ptr, VARIANT_BOOL * Cancel)
DocumentBeforeSave(IDispathch ptr, VARIANT_BOOL * SaveAsUI, VARIANT_BOOL * Cancel)
这三个函数的时候Word会崩溃,调试发现传入的ptr的__vfptr为0,.ccp_ATL_FUNC_INFO StartupInfo = {CC_STDCALL,VT_EMPTY,0};
_ATL_FUNC_INFO DocumentOpenInfo = {CC_STDCALL,VT_EMPTY,1,{VT_DISPATCH | VT_BYREF}};
_ATL_FUNC_INFO DocumentBeforeCloseInfo = {CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH | VT_BYREF,VT_BYREF | VT_BOOL}};
_ATL_FUNC_INFO DocumentBeforePrintInfo = {CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH | VT_BYREF,VT_BYREF | VT_BOOL}};
_ATL_FUNC_INFO DocumentBeforeSaveInfo = {CC_STDCALL,VT_EMPTY,3,{VT_DISPATCH | VT_BYREF,VT_BYREF | VT_BOOL,VT_BYREF | VT_BOOL}};
.hextern _ATL_FUNC_INFO StartupInfo;
extern _ATL_FUNC_INFO DocumentOpenInfo;
extern _ATL_FUNC_INFO DocumentBeforeCloseInfo;
extern _ATL_FUNC_INFO DocumentBeforePrintInfo;
extern _ATL_FUNC_INFO DocumentBeforeSaveInfo;class ATL_NO_VTABLE CDRM5 :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDRM5, &CLSID_DRM5>,
public ISupportErrorInfo,
public IDispatchImpl<IDRM5, &IID_IDRM5, &LIBID_ADDIN5Lib>,
public IDispatchImpl<_IDTExtensibility2, &IID__IDTExtensibility2, &LIBID_AddInDesignerObjects>,
public IDispEventSimpleImpl<6,CDRM5,&__uuidof(Word::ApplicationEvents2)>void __stdcall CDRM5::Startup()
{
AfxMessageBox("Startup");
}void __stdcall CDRM5::DocumentOpen(IDispatchPtr ptr)
{
AfxMessageBox("Opening");
}void __stdcall CDRM5::DocumentBeforeClose(IDispatchPtr ptr,VARIANT_BOOL * CancelDefault)
{
//......
}void __stdcall CDRM5::DocumentBeforePrint(IDispatchPtr ptr,VARIANT_BOOL * CancelDefault)
{
//......
}void __stdcall CDRM5::DocumentBeforeSave(IDispatchPtr ptr,VARIANT_BOOL * SaveAsUI,VARIANT_BOOL * Cancel)
{
//......
}SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x01, Startup, &StartupInfo)
SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x04, DocumentOpen, &DocumentOpenInfo)
SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x06, DocumentBeforeClose, &DocumentBeforeCloseInfo)
SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x07, DocumentBeforePrint, &DocumentBeforePrintInfo)
SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x08, DocumentBeforeSave, &DocumentBeforeSaveInfo)没分,请问各位能帮忙看下吗?谢谢
Startup()
DocumentOpen(IDispathch ptr)
等函数的时候没有问题,而调用同样的
DocumentBeforeClose(IDispathch ptr, VARIANT_BOOL * Cancel)
DocumentBeforePrint(IDispathch ptr, VARIANT_BOOL * Cancel)
DocumentBeforeSave(IDispathch ptr, VARIANT_BOOL * SaveAsUI, VARIANT_BOOL * Cancel)
这三个函数的时候Word会崩溃,调试发现传入的ptr的__vfptr为0,.ccp_ATL_FUNC_INFO StartupInfo = {CC_STDCALL,VT_EMPTY,0};
_ATL_FUNC_INFO DocumentOpenInfo = {CC_STDCALL,VT_EMPTY,1,{VT_DISPATCH | VT_BYREF}};
_ATL_FUNC_INFO DocumentBeforeCloseInfo = {CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH | VT_BYREF,VT_BYREF | VT_BOOL}};
_ATL_FUNC_INFO DocumentBeforePrintInfo = {CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH | VT_BYREF,VT_BYREF | VT_BOOL}};
_ATL_FUNC_INFO DocumentBeforeSaveInfo = {CC_STDCALL,VT_EMPTY,3,{VT_DISPATCH | VT_BYREF,VT_BYREF | VT_BOOL,VT_BYREF | VT_BOOL}};
.hextern _ATL_FUNC_INFO StartupInfo;
extern _ATL_FUNC_INFO DocumentOpenInfo;
extern _ATL_FUNC_INFO DocumentBeforeCloseInfo;
extern _ATL_FUNC_INFO DocumentBeforePrintInfo;
extern _ATL_FUNC_INFO DocumentBeforeSaveInfo;class ATL_NO_VTABLE CDRM5 :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDRM5, &CLSID_DRM5>,
public ISupportErrorInfo,
public IDispatchImpl<IDRM5, &IID_IDRM5, &LIBID_ADDIN5Lib>,
public IDispatchImpl<_IDTExtensibility2, &IID__IDTExtensibility2, &LIBID_AddInDesignerObjects>,
public IDispEventSimpleImpl<6,CDRM5,&__uuidof(Word::ApplicationEvents2)>void __stdcall CDRM5::Startup()
{
AfxMessageBox("Startup");
}void __stdcall CDRM5::DocumentOpen(IDispatchPtr ptr)
{
AfxMessageBox("Opening");
}void __stdcall CDRM5::DocumentBeforeClose(IDispatchPtr ptr,VARIANT_BOOL * CancelDefault)
{
//......
}void __stdcall CDRM5::DocumentBeforePrint(IDispatchPtr ptr,VARIANT_BOOL * CancelDefault)
{
//......
}void __stdcall CDRM5::DocumentBeforeSave(IDispatchPtr ptr,VARIANT_BOOL * SaveAsUI,VARIANT_BOOL * Cancel)
{
//......
}SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x01, Startup, &StartupInfo)
SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x04, DocumentOpen, &DocumentOpenInfo)
SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x06, DocumentBeforeClose, &DocumentBeforeCloseInfo)
SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x07, DocumentBeforePrint, &DocumentBeforePrintInfo)
SINK_ENTRY_INFO(6, __uuidof(Word::ApplicationEvents2),/*dispid*/ 0x08, DocumentBeforeSave, &DocumentBeforeSaveInfo)没分,请问各位能帮忙看下吗?谢谢
解决方案 »
- 怎么删除一个文件,不能恢复的
- 非对齐方式取数
- 有用过WINPCAP的兄弟没?做行为还原时接收收TCP包时顺序不正确,有什么好的办法来解决?这样还原的文件是错误的
- 如何得到usb模拟的串口的名字?
- 怎么样才能提高画线的效率.
- 我用mfc做的界面,如何让我显示文字的窗口LISTBOX随着对话框的放大缩小而同时放大缩小?
- 全局函数
- 关于使用OpenGL做棋类游戏的!
- 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!!
- 一个关于拖放的问题
- 测试题:OnOK()、OnCancel()、OnClose()、OnDestroy()之间的调用顺序,第一个回答正确者将获得30的奖励!
- 下拉按钮无法响应
但是DocumentBeforeClose需要监控Word的Event来实现两年前的帖子又被我搜出来了,不知道楼主实现了没有