Как заставить Excel VBA использовать обновленный COM-сервер

Я разрабатываю COM-сервер для использования из Excel VBA. Когда я обновляю сервер (редактирую код, отменяю регистрацию, повторно регистрируюсь) Excel, кажется, продолжает использовать исходную версию COM-сервера, а не обновленную версию. Единственный способ заставить его использовать обновленную версию - это закрыть и снова открыть Excel, что немного раздражает. Есть ли способ заставить Excel использовать только что зарегистрированную версию (возможно, какой-то вариант «очистки кеша»)?

Подробнее:

Сервер разрабатывается на Python с использованием win32com.

В VBA я делаю что-то вроде:

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

Где Foo.Bar - это COM-сервер, который я зарегистрировал в реестре.

Если я отменяю регистрацию сервера, а затем запускаю код VBA, я получаю сообщение об ошибке «Невозможно создать объект» от VBA, поэтому он должен понимать, что что-то происходит. Но как только я перерегистрируюсь, он забирает старую версию.

Любые подсказки приветствуются!

Спасибо,

Энди


person Andy    schedule 26.02.2010    source источник


Ответы (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. Это работает до тех пор, пока входы не меняются. Предположительно, это приведет к штрафу во время выполнения, поэтому может потребоваться удалить перезагрузку для окончательной версии, но это работает для целей разработки.

person Andy    schedule 01.03.2010

Просто предложение, вы пытались выгрузить объект? Может быть, создать в вашем excel spredsheat кнопку, которая заставит выгружать объект.

Я надеюсь, что это помогает

person luc    schedule 26.02.2010
comment
К сожалению, Excel это не нравится - не могу загрузить или выгрузить этот объект. - person Andy; 01.03.2010