各位,我在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)没分,请问各位能帮忙看下吗?谢谢