Как заставить Excel VBA использовать обновленный COM-сервер - PullRequest
0 голосов
/ 26 февраля 2010

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

Подробнее:

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

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

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

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

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

Любые советы приветствуются!

Спасибо

Andy

Ответы [ 2 ]

1 голос
/ 01 марта 2010

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

0 голосов
/ 26 февраля 2010

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

Надеюсь, это поможет

...