【问题标题】:How to force Excel VBA to use updated COM server如何强制 Excel VBA 使用更新的 COM 服务器
【发布时间】:2011-01-21 08:26:12
【问题描述】:

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

更多细节:

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

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

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

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

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

感谢任何提示!

谢谢,

安迪

【问题讨论】:

    标签: excel com python win32com vba


    【解决方案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 方法时重新加载的代码。只要输入不变,这就会起作用。这可能会导致运行时损失,因此可能希望删除最终版本的重新加载,但它适用于开发目的。

    【讨论】:

      【解决方案2】:

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

      希望对你有帮助

      【讨论】:

      • 很遗憾 Excel 不喜欢这样 - “无法加载或卸载此对象”。
      猜你喜欢
      • 2015-01-30
      • 2011-11-12
      • 2023-04-02
      • 2018-06-22
      • 2015-06-23
      • 2017-06-13
      • 2010-10-04
      • 2017-09-09
      • 1970-01-01
      相关资源
      最近更新 更多