おもむろに 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 で成功した手法。