我们在做一些office的插件时会遇到一个问题,当我们卸载自定义的插件时一般不能把产生的按钮、自定义菜单等删除干净。通常是按钮依然存在,但是没有作用了,又称为“僵尸程序”。
 形成原因:在 OnBeginShutdown中调用button.Delete()进行按钮的删除工作。但是此处其实是有一个异常抛出的。错误本质是我们的自定义菜单和按钮是存放在模板中的,而在OnBeginShutdown之前模板就已经关闭了,所以就出现了'Object Required'的异常。所以这些代码都不会执行成功,也就删除不了我们的自定义按钮和菜单了请问各位大虾如何解决

解决方案 »

  1.   

    没有出现过楼主说的现象,做这种插件我一般是使用VB写的(因为使用微软提供的VBA接口比较方便)。
      

  2.   

    word add-in 卸载时如何清除自定义的按钮和菜单 
    我们在做一些office的插件(add-in)时会遇到一个问题,当我们卸载自定义的插件时一般不能把产生的按钮、自定义菜单等删除干净。即使按照微软官方的一些例子文档来建立和卸载add-in,这个问题依然存在。通常是按钮依然存在,但是没有作用了,又称为“僵尸程序”。
    由于暂时没有找到卸载excel add-in好的解决方案,这里只介绍如何干净的卸载word add-in。按照微软的一些例子中的提供的方法,在 OnBeginShutdown(该事件在word进程关闭之前发生)中调用button.Delete()进行相关按钮的删除工作。但是此处其实是有一个异常抛出的:Exception from HRESULT: 0x800A01A8。只不过office默认是不处理这个异常也不显示,所以我们觉得像没发生一样。这里错误本质是我们的自定义菜单和按钮是存放在模板中的,而在OnBeginShutdown之前模板就已经关闭了,所以就出现了'Object Required'的异常。所以这些代码都不会执行成功,也就删除不了我们的自定义菜单了。
      

  3.   


    我使用VB写的程序没有出现过楼主说的情况,不过可以提供一个解决的方法:在程序启动时在建立工具条前,先查询到normal.dot模板的存储路径,然后拷贝一份到临时目录,调用微软接口使当前WORD加载此新拷贝的模板为主模板,在退出时删除此临时文件。按上面的方法处理时由于加载的不是normal.dot主模板,而是加载的自己新建的临时模板,所以按钮、菜单都会在新建的模板上。不会影响到normal模板,也就不会产生不起作用的按钮和菜单了。
      

  4.   

    word运行时有主模板(只能设置一个)、附加模板(可以有多个)两种,我们建的菜单按钮是修改了主模板。