0

COM ライブラリを理解しようとしていますが、まだ混乱しています。Python オブジェクト com を可視化したい場合、私が見つけることができる唯一の指示は、呼び出されてクラス インスタンスを名前で生成するために使用される COM サーバーを設定する Python スクリプトを作成することです。IIUC さん、これは、CLSID をserver.pyファイルのパスにリンクする情報をレジストリに永続的に追加することで可能になります。最小限の例を次に示します。

class HelloWorld:
    # pythoncom.CreateGuid()
    _reg_clsid_ = "{7CC9F362-486D-11D1-BB48-0000E838A65F}"
    _reg_desc_ = "Python Test COM Server"
    _reg_progid_ = "PythonTestServer.HelloWorld"

    _public_methods_ = ["Hello"]
    _public_attrs_ = ["softspace", "noCalls"]
    _readonly_attrs_ = ["noCalls"]

    def __init__(self):
        self.softspace = 1
        self.noCalls = 0

    def Hello(self, who):
        self.noCalls = self.noCalls + 1
        # insert "softspace" number of spaces
        return "Hello" + " " * self.softspace + str(who)


if __name__ == "__main__": #run once to register the COM class
    import win32com.server.register

    win32com.server.register.UseCommandLine(HelloWorld) #this is what I want to avoid

次のように呼び出されます:

Dim a as Object = CreateObject("PythonTestServer.HelloWorld") 'late binding
a.softSpace = 10
?a.Hello("World") 'prints "Hello          World"

ただし、過去に、COMクライアントプロジェクト(VBA)への参照として追加できるfile.dllをダウンロードしたことがあり、--register/regsrvr/etcを呼び出すことはありません。実行時にレジストリを変更して元に戻すために必要なすべての情報が dll に含まれていると思います。アーリー バインディングまたはレイト バインディングを使用して、クラス インスタンスを作成できます。参照されている dll にタイプ ライブラリが含まれている場合は、IntelliSense も取得します。

後者の方法は、はるかに単純で移植性が高いと感じます。これをPythonでエミュレートする方法はありますか?

4

0 に答える 0