EDIT : Excel を再起動すると、VBA が新しいメソッドを表示できることがわかりました。ただし、形式は異なりますが、私の質問は依然として残っています。Excel を再起動せずに新しいメソッドを強制的に表示するにはどうすればよいでしょうか。
次のような単純な COM サーバーがあります。
class COMServerThing:
_public_methods_ = ["DoStupidThing"]
_reg_progid_ = "COMServerThing.Utilities"
_reg_clsid_ = "{A9DAECC7-2154-42E6-95B3-53A27EAB63E2}"
def DoStupidThing(self):
return 'foo'
私は次のように登録します。
import win32com.server.register
win32com.server.register.UseCommandLine(COMServerThing)
これにより、VBA から新しい COMServerThing オブジェクトを作成し、Excel から Python コードを呼び出すことができます。次に、このサーバーに新しいメソッドを追加します。私は明白なことをやろうとしました:
class COMServerThing:
# Add the new method to the list of public methods ...
_public_methods_ = ["DoStupidThing", "AnotherStupidThing"]
_reg_progid_ = "COMServerThing.Utilities"
_reg_clsid_ = "{A9DAECC7-2154-42E6-95B3-53A27EAB63E2}"
def DoStupidThing(self):
return 'foo'
# ... and implement it on the class.
def AnotherStupidThing(self):
return 42
これを行った後、VBAから新しく登録されたメソッドにアクセスできません。うまくいかなかった他のいくつかのことを試しました:
- サーバーを再登録しました。
- サーバーの登録を解除してから、再登録しました。
- サーバーの登録を解除し、クラス ID を変更してから、再登録しました。
サーバーの名前を変更し、そのクラス ID を変更し、サーバーが含まれるソース ファイルの名前を変更し、新しいサーバーを登録することだけが機能しました。この時点で、まったく新しい COM サーバーが表示されます。
私は Windows/COM の開発者ではないので、あからさまに明らかな何かが欠けていると確信しています。登録済みの COM サーバーに新しいメソッドを追加するにはどうすればよいですか?