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

0 投票
2 回答
538 浏览
提问于 2025-04-15 19:45

我正在开发一个COM服务器,目的是让Excel的VBA可以使用。当我更新这个服务器(比如修改代码、取消注册、重新注册)后,Excel似乎还是在使用原来的COM服务器,而不是更新后的版本。我发现唯一能让Excel使用更新版本的方法就是关闭再重新打开Excel,这样有点麻烦。有没有办法强制Excel使用新注册的版本(也许有什么“清除缓存”的选项)?

更多细节:

这个服务器是用Python和win32com开发的。

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

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

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

如果我取消注册这个服务器,然后运行VBA代码,就会出现“无法创建对象”的错误,这说明VBA意识到有问题。但是一旦我重新注册,它又会使用旧版本。

任何提示都非常感谢!

谢谢,

Andy

2 个回答

0

我有个建议,你试过卸载这个对象吗?也许可以在你的Excel表格里创建一个按钮,强制卸载这个对象。

希望这能帮到你。

2

我找到了解决我问题的方法——大致的思路是设置一个主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方法时都会重新加载这个模块。只要输入不变,这样做是有效的。不过,这样可能会有运行时的性能损失,所以在最终版本中可能需要去掉这个重新加载的步骤,但在开发阶段这样做是没问题的。

撰写回答