如何强制Excel VBA使用更新的COM服务器
问题描述:
我正在开发从Excel VBA使用的COM服务器。当我更新服务器(编辑代码,取消注册,重新注册)时,Excel似乎继续使用COM服务器的原始版本,而不是更新后的版本。我发现让它使用更新版本的唯一方法是关闭并重新打开Excel,这会让人有点恼火。有没有办法强制Excel使用新注册的版本(也许某种“清除缓存”选项)?如何强制Excel VBA使用更新的COM服务器
更多细节:
服务器正在使用Python开发win32com。
在VBA我做这样的事情:
set obj=CreateObject("Foo.Bar")
obj.baz()
哪里Foo.Bar是我在注册表中注册的COM服务器。
如果我取消注册服务器然后运行VBA代码,我从VBA得到一个“无法创建对象”的错误,所以它必须意识到发生了某些事情。但是,一旦我重新注册,它会提取旧版本。
任何提示赞赏!
感谢,
安迪
答
我已经找到了解决我的问题 - 的总体思路是:设置的东西,使主COM服务器类动态加载COM服务器代码的其余部分时,它被称为。所以,在Python我已经创建了一个COM服务器类,看起来像:
import main_code
class COMInterface:
_public_methods_ = [ 'method1' ]
_reg_progid_ = "My.Test"
_reg_clsid_ = "{D6AA2A12-A5CE-4B6C-8603-7952B711728B}"
def methods(self, input1,input2,input3):
# force python to reload the code that does the actual work
reload(main_code)
return main_code.Runner().go(input1,input2,input3)
的main_code模块包含执行实际工作,并且每个COM方法被调用时重新加载代码。只要输入不会改变,它就会工作。这可能是一个运行时间的惩罚,所以可能要删除最终版本的重新加载,但它适用于开发目的。
答
只是一个建议,你试图卸载对象?也许在你的excel spredsheat中创建一个强制卸载对象的按钮。
我希望它能帮助
不幸的是,Excel不喜欢那样 - “无法加载或卸载此对象”。 – Andy 2010-03-01 01:29:51