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

推荐订阅源

W
WeLiveSecurity
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
The Register - Security
The Register - Security
Stack Overflow Blog
Stack Overflow Blog
博客园 - 三生石上(FineUI控件)
T
Threat Research - Cisco Blogs
S
SegmentFault 最新的问题
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Proofpoint News Feed
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
M
MIT News - Artificial intelligence
AI
AI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
B
Blog
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Google DeepMind News
Google DeepMind News
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
C
Cybersecurity and Infrastructure Security Agency CISA
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
U
Unit 42
腾讯CDC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
H
Help Net Security
Recent Announcements
Recent Announcements
P
Privacy & Cybersecurity Law Blog
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 热门话题
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
H
Heimdal Security Blog
博客园 - 聂微东
S
Securelist
大猫的无限游戏
大猫的无限游戏
Cloudbric
Cloudbric
Cisco Talos Blog
Cisco Talos 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目录下)。