如何强制Excel VBA使用更新的COM服务器

时间:2010-02-26 07:06:48

标签: excel-vba com python win32com vba

我正在开发一个从Excel VBA使用的COM服务器。当我更新服务器(编辑代码,取消注册,重新注册)时,Excel似乎继续使用COM服务器的原始版本,而不是更新版本。我发现让它使用更新版本的唯一方法是关闭并重新打开Excel,这有点令人恼火。有没有办法强制Excel使用新注册的版本(可能是某种“清除缓存”选项)?

更多详情:

使用win32com在Python中开发服务器。

在VBA中,我正在做类似的事情:

set obj=CreateObject("Foo.Bar")
obj.baz()

其中Foo.Bar是我在注册表中注册的COM服务器。

如果我取消注册服务器然后运行VBA代码,我从VBA获得“无法创建对象”错误,因此它必须意识到某些事情正在发生。但是一旦我重新注册它就会拿起旧版本。

任何提示都赞赏!

谢谢,

安迪

2 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法 - 一般的想法是设置一些东西,以便主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方法时都会重新加载。只要输入没有改变,这就可以工作。对此可能会有运行时惩罚,因此可能希望删除最终版本的重新加载,但它可用于开发目的。

答案 1 :(得分:0)

只是一个建议,你试过卸载对象吗?也许在你的excel spredsheat中创建一个强制卸载对象的按钮。

我希望它有所帮助