Published On: 1970-01-01|Last Updated: 2021-03-04|Categories: Uncategorized|

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

関連