2010-02-26 60 views
0

我正在開發從Excel VBA使用的COM服務器。當我更新服務器(編輯代碼,取消註冊,重新註冊)時,Excel似乎繼續使用COM服務器的原始版本,而不是更新後的版本。我發現讓它使用更新版本的唯一方法是關閉並重新打開Excel,這會讓人有點惱火。有沒有辦法強制Excel使用新註冊的版本(也許某種「清除緩存」選項)?如何強制Excel VBA使用更新的COM服務器

更多細節:

服務器正在使用Python開發win32com。

在VBA我做這樣的事情:

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

哪裏Foo.Bar是我在註冊表中註冊的COM服務器。

如果我取消註冊服務器然後運行VBA代碼,我從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方法被調用時重新加載代碼。只要輸入不會改變,它就會工作。這可能是一個運行時間的懲罰,所以可能要刪除最終版本的重新加載,但它適用於開發目的。

0

只是一個建議,你試圖卸載對象?也許在你的excel spredsheat中創建一個強制卸載對象的按鈕。

我希望它能幫助

+0

不幸的是,Excel不喜歡那樣 - 「無法加載或卸載此對象」。 – Andy 2010-03-01 01:29:51