Реализация интерфейса в стиле COM с ctypes для размещения плагина VST3 - PullRequest
0 голосов
/ 10 июля 2020

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 ++ в памяти таким образом, чтобы внутренняя память.

...