惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LangChain Blog
博客园 - 【当耐特】
I
InfoQ
腾讯CDC
人人都是产品经理
人人都是产品经理
H
Help Net Security
Y
Y Combinator Blog
B
Blog
博客园 - Franky
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 叶小钗
D
Docker
博客园 - 聂微东
B
Blog RSS Feed
G
Google Developers Blog

博客园 - 小诈

[.net]正则表达式整理 今日所思 伟大的意大利夺冠了!疯狂庆祝! 制作包含.net framework的安装包 解决不能上网的问题(Wincock绑架) [ASP.NET揭密读书笔记]额外的控件和资源 [ASP.NET揭密读书笔记]应用程序跟踪和监视 [ASP.NET揭密读书笔记]ADO.NET介绍 [ASP.NET揭密读书笔记]用户自定义控件 [ASP.NET揭密读书笔记]连接池 安装Ubuntu 痛苦的胃镜检查 [转载]微软好员工的十个标准 新年新气象,恭喜发财 WEB中服务器端Table的行集中要注意ViewState 2005年年终总结 招聘.NET高级软件工程师 DataTable.Select方法的性能问题 [转贴]Visual Studio 2005常用插件搜罗
word add-in 卸载时如何清除自定义的按钮和菜单
小诈 · 2006-07-05 · via 博客园 - 小诈

我们在做一些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目录下)。