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'的异常。所以这些代码都不会执行成功,也就删除不了我们的自定义菜单了。
解决方法是使用另外一个空白模板来解决这个问题,office有个启动目录(通常是C:\Program Files\Microsoft Office\OFFICE11\STARTUP),在此目录下的word模板在word启动时会自动加载,我们添加一个自己的模板用来做自定义按钮和菜单的容器,将这个模板放在add-in安装包中这样卸载的时候就自动删除了这个模板,也就删除了那些自定义按钮和菜单了。然后剩下的工作就是把默认的normal.dot模板换为我们自定义的模板(以下称addin.dot)作为自定义按钮的容器了。word中有个属性CustomizationContext 是用来指定使用的模板的。我们在OnConnect方法中执行下面的代码{wdApp = (Microsoft.Office.Interop.Word.Applcation)application; wdApp.DocumentChange+=new Microsoft.Office.Interop.Word.ApplcationEvents4_DocumentChangeEventHandler(WordApp_DocumentChange);}DocumentChange事件在创建新文档、打开已有文档或激活其他文档时发生,保证了下面的代码会被执行。
通过这样一个变换的过程,我们就实现了将自定义按钮和菜单保存到自定义模板上,卸载时也就卸载这些按钮和菜单,保证用户office环境的干净。
附录1:将word模板加入安装包的方法,右键安装项目的“目标计算机上的文件系统”->添加特殊文件夹->Program Files文件夹,然后依次添加Microsoft Office、OFFICE11、STARTUP文件夹,然后添加该模板文件。
附录2:Excel并未提供相关的编程模型,所以excel下面的清除还没有解决。目前知道excel下的默认模板是Excel11.xlb(C:\Documents and Settings\用户名\Application Data\Microsoft\Excel目录下)。