COM-интерфейс - это в основном ctypes Structure
, первый член которого указывает на VTable указателей функций. VST3 использует ту же архитектуру, поэтому он кроссплатформенный. Не используются вызовы Windows API или функциональность COM. В Windows используется соглашение stdcall
. Итак, я понял, что мне нужно определить интерфейсы FUnknown
и IPluginFactory
для создания экземпляра плагина и получения его фабрики плагинов. Это мой код:
# Base interface. Inherited by all other interfaces.
class FUnknownVtbl(Structure):
_fields_ = [
('queryInterface', WINFUNCTYPE(c_int32, c_int8 * 16, POINTER(c_void_p))),
('addRef', WINFUNCTYPE(c_uint32)),
('release', WINFUNCTYPE(c_uint32))
]
class FUnknown(Structure):
_anonymous_ = ('lpVtbl',)
_fields_ = [
('lpVtbl', POINTER(FUnknownVtbl)),
('iid', c_void_p)
]
class IPluginFactoryVtbl(FUnknownVtbl):
_fields_ = [
('getFactoryInfo', WINFUNCTYPE(c_int32, POINTER(PFactoryInfo))),
('countClasses', WINFUNCTYPE(c_int32)),
('getClassInfo', WINFUNCTYPE(c_int32, c_int32, POINTER(PClassInfo))),
('createInstance', WINFUNCTYPE(c_int32, c_char_p, c_char_p, POINTER(c_void_p)))
]
# A pointer to this is returned by calling GetPluginFactory exported function
class IPluginFactory(Structure):
_anonymous_ = ('lpVtbl',)
_fields_ = [
('lpVtbl', POINTER(IPluginFactoryVtbl)),
('iid', c_void_p)
]
PClassInfo
& PFactoryInfo
- это обычные структуры в стиле C, поэтому я их пропустил.
К которому я получаю ошибка: AttributeError: type object 'LP_FUnknownVtbl' has no attribute '_fields_'
. Очевидно, я не изучал COM и не знаю, размещены ли виртуальные классы C ++ в памяти таким образом, чтобы внутренняя память.