3

公開されているすべてのインターフェイスを取得するために、Python で Windows COM DLL を読み込もうとしています。

依存関係ウォーカーツールを使用して、dll 内の関数を一覧表示できます。4つの関数しか表示されません:

  1. DllCanUnloadNow
  2. DllGetClassObject
  3. DllRegisterServer
  4. DllUnregisterServer

私の理解が正しければ、DllGetClassObject() を使用してクラスのオブジェクトを取得し、公開されたインターフェイスを使用する必要があります。

オブジェクトを抽出するために pythoncom と win32com.client を使用しています (別のスタックオーバーフローの投稿からレシピを取得しました)

import pythoncom
import win32com.client

def CreateInstanceFromDll(dll, clsid_class, iid_interface=pythoncom.IID_IDispatch, pUnkOuter=None, dwClsContext=pythoncom.CLSCTX_SERVER):
    from uuid import UUID
    from ctypes import OleDLL, c_long, byref

    e = OleDLL(dll)
    print (e)
    #print (e.DllRegisterServer())

    clsid_class = UUID(clsid_class).bytes_le
    iclassfactory = UUID(str(pythoncom.IID_IClassFactory)).bytes_le
    com_classfactory = c_long(0)
    hr = e.DllGetClassObject(clsid_class, iclassfactory, byref(com_classfactory))
    MyFactory = pythoncom.ObjectFromAddress(com_classfactory.value, pythoncom.IID_IClassFactory)
    i = MyFactory.CreateInstance(pUnkOuter, iid_interface)
    d = win32com.client.__WrapDispatch(i)
    return d

print (CreateInstanceFromDll('PTSControl.dll', '{32a917e0-b1d4-4692-b0d7-793d81d9c8b5}'))

cls_idPTSControl ツールの Windows レジストリから取得しました。しかし、これは WindowsError をスローします。

<OleDLL 'PTSControl.dll', handle 70010000 at 2451470>
Traceback (most recent call last):
  File "C:\wp\automation.py", line 35, i
n <module>
    print (CreateInstanceFromDll('PTSControl.dll', '{32a917e0-b1d4-4692-b0d7-793
d81d9c8b5}'))
  File "C:\wp\automation.py", line 29, i
n CreateInstanceFromDll
    hr = e.DllGetClassObject(clsid_class, iclassfactory, byref(com_classfactory)
)
  File "_ctypes/callproc.c", line 945, in GetResult
WindowsError: [Error -2147467262] No such interface supported

私が間違っていることはありますか?ツールのソース コードにアクセスできません。

C++ ではこれは 2 段階のプロセスですが、Python ではどうすればよいかわかりません:

  1. CoInitializeEx()
  2. CoCreateInstance()

一般に、Python で Windows COM DLL にアクセスするための最良の手法は何ですか? ありがとう !!

4

1 に答える 1