描述:
这段时间我在使用VC和ATL COM做一个word的插件,基本上是遵照徐景江的几篇文章做的框架,但是现在我发现了好几个问题:
1,我在Add-ins的OnConnection方法中生成的工具条按钮和菜单,在OnDisConnection方法中不知道怎么将这些按钮和菜单去掉,按钮还没有什么问题,我可以拖出来关闭了事,但是菜单则会在每次运行插件就会添加一个菜单项,导致了菜单中多出了很多的项,怎么办呢?有没有什么方法可以在OnDisconnection方法中释放菜单和工具条,而且我好像发现OnDisconnection方法根本没有用,我用MessageBox测试根本就不会显示,这是什么回事呢?
2,按照徐景江的例子,我是用写注册表的方式是的插件可以每次自动在word启动时候加载,但是我发现了一个奇怪的现象,每次我重新编译插件时候(同时也就重新注册了插件),插件就会自动加载,但是我把word关闭之后再次打开,插件就没有自动加载,我必须手动的加载才行,不知道这是为什么,我在程序的.reg文件中设定插件的LoadBehavior是0x00000003(自动加载),但是每次插件运行一次之后注册表中的表项就变成了0x00000002,这是什么回事呢,象金山词霸这样的插件是怎么样实现的呢?
3,我的插件需要自己做一个按钮来打开一个word文档,我的插件程序中首先在OnConnection中得到word的应用程序变量:
STDMETHOD(OnConnection)(IDispatch * Application, ext_ConnectMode ConnectMode, IDispatch * AddInInst, SAFEARRAY * * custom)
{
CComPtr < Office::_CommandBars> spCmdBars;
// Word应用接口_Application
CComQIPtr<MSWord::_Application> spApp(Application);
ATLASSERT(spApp);
m_spApp=spApp;
//................................
//
}
然后在我的按钮的事件中使用如下代码来打开一个word文档:
CComQIPtr<MSWord::Documents> documents=m_appWord->GetDocuments();
CComQIPtr<MSWord::_Document> doc;
COleVariant vFileName(fileName,VT_BSTR);
COleVariant covTrue((short)TRUE),covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
doc=documents->Open(&vFileName,&covFalse,&covFalse,&covFalse,&covOptional,&covOptional,&covOptional,&covOptional,&covOptional,&covOptional,&covOptional,&covOptional);
结果word异常退出,每次都是这样,是我的智能指针出错了吗?这个问题非常关键,我实在是没辙了,哪位大虾看过来,帮帮忙,谢谢
解决方案1:
2、你的插件应该是和其他插件的CLSID冲突了,才会导致你说的那些情况的发生,建议你新建一个工程,这样会自动生成新的CLSID,每次就会自动加载;
3、打开文档没有你那么费事,下面代码就可以打开了。
CComVariant Var(m_strSourceFile);//CString m_strSourceFile;
m_spApp->Documents->Open(&Var);
1.OnDisconnection在你的头文件到底有没有映射到?
2.你注册表是否没写正确,导致每次都要重新写?
3.documents->Open的参数可能没有设置对
以上请详细对照例子程序,或查看MSDN的VB代码