以编程方式重新生成.exd文件,在加载VBA时执行

11

在将 Microsoft Office 2007 更新为 Office 2010 后,一些嵌入在我们软件中的自定义 VBA 脚本无法编译,出现以下错误信息:

对象库无效或包含指向找不到的对象定义的引用。

据我所知,这个错误是由于来自 Microsoft 的安全更新(Microsoft Security Advisory 960715)导致的。在向 VBA 脚本添加 ActiveX 控件时,有关这些控件的信息存储在本地硬盘上的缓存文件中(.exd 文件)。安全更新修改了其中一些控件,但 .exd 文件没有自动更新。当 VBA 脚本尝试加载存储在缓存文件中的旧版控件时,就会出现错误。必须从硬盘中删除这些缓存文件,才能成功加载控件(这将自动创建新的、更新过的 .exd 文件)。

我想要做的是,在我们的软件加载时以编程方式(使用 Visual C++)删除过期的 .exd 文件。CApcProject::ApcProject.Open 使用以下标志打开 VBA 项目:axProjectThrowAwayCompiledState

TestHR(ApcProject.Open(pHost, (MSAPC::AxProjectFlag) (MSAPC::axProjectNormal | MSAPC::axProjectThrowAwayCompiledState)));

根据文档,此标志应导致重新编译VBA项目,并删除并重建临时文件。我也尝试更新宿主应用程序类型库的校验和,这应该具有相同的效果。但是,这些修复措施似乎都不起作用了,我已经没有更多想法了。


3
建议您先尝试手动删除.exd文件以验证是否解决了问题(在尝试以编程方式解决之前)。在我的情况下,这并没有解决问题。https://dev59.com/nlLTa4cB1Zd3GeqPds9X - CaBieberach
这可能是您所提到的KillBit问题,也可能是其他问题。您从x86 Office 2007升级到x64 Office 2010了吗?您是否检查了VBA引用中是否有缺失项?您是否遇到“隐藏模块中的编译错误”错误?您是否已经阅读了http://blogs.msdn.com/b/vsod/archive/2009/06/05/visual-basic-6-controls-stop-working-after-security-advisory-960715.aspx?您是否在Excel选项中取消了“忽略使用动态数据交换(DDE)的其他应用程序”?同意@CaBieberach的看法,您可能需要通过手动删除.exd来确认这是否真的是问题。 - Todd Main
我们已经验证删除exd文件可以解决问题(在几台测试机器上手动执行)。当升级到x86版本的Office时,问题就会出现(我们不支持将Office 2010 x64与我们的软件组合使用)。目前,当客户遇到此问题时,我们让他们运行一个脚本来删除所有exd文件。 - aspartame
1个回答

2

我之前遇到过这个问题,而且推荐的(并且有效的)解决方案是删除系统驱动器上所有的 .exd 文件。显然,每当需要时都会重新构建它们,因此没有必要以编程方式触发重建过程。


问题是我实际上需要以编程的方式来完成它。但是已经过去了将近一年,仍然没有找到方法来完成它,所以我会接受这个答案并继续我的生活 ;) - aspartame

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接