カテゴリー
Uncategorized

[Python] win32com.client.Dispatch() でもってこれないオブジェクトを呼ぶ

おもむろに comtypes を取り出す

from comtypes.client import CreateObject

CLSID を調べる

from comtypes import *
CLSID_Sti = GUID('{B323F8E0-2E68-11D0-90EA-00AA0060F86C}')

Interface を作成する

*.idl がある

midl で *.tlb に変換する

*.tlb がある
try:
import comtypes.gen.hoge
except ImportError:
from comtypes.client import GetModule
GetModule('*.tlb へのパスとか *.exe;*.dll へのパスとか')
from comtypes.gen.hoge import *
*.h がある

頑張って自力で書く。こんな感じで↓

from ctypes import *
from ctypes.wintypes import *
from comtypes import *
class IStillImage(IUnknown):
_case_insensitive_ = True
_iid_ = GUID('{641BD880-2DC8-11D0-90EA-00AA0060F86C}')
_idlflags_ = []
IStillImage._methods_ = [
COMMETHOD([], HRESULT, 'Initialize',
( ['in'], HINSTANCE, 'hinst' ),
( ['in'], DWORD, 'dwVersion' ),
),
COMMETHOD([], HRESULT, 'GetDeviceList',
( ['in'], DWORD, 'dwType' ),
( ['in'], DWORD, 'dwFlags' ),
( ['out'], POINTER(DWORD), 'pdwItemsReturned' ),
( ['out'], POINTER(LPVOID), 'ppBuffer' ),
),
...
]
ドキュメントしかない。何もない

諦める。要するに関数ポインタの構造体なんで、順序がわからないと呼べない。多分。

準備完了

後は好きにする。

obj = CreateObject(CLSID_Sti, interface=IStillImage)
obj.RegisterLaunchApplication('AppName', 'command line')

IStillImage と INetCfg で成功した手法。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です