ctypes и доступ к методам интерфейса com - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь загрузить аудио из Windows Media Foundation, используя python ctypes и coms, но не могу заставить его работать.

Проблема в том, что мне нужен интерфейсный объект IMFAttributes для использования его методов после создания, в этом примере SetUINT32. Таким образом, чтобы получить объект указателя, я использую attrib_config.contents, который возвращает объект IMAttributes. Однако попытка доступа к любым методам приводит к ошибке доступа для чтения.

Вот соответствующий код без спама всего файла.

class IMFAttributes(com.IUnknown):
    _methods_ = [
         .....
         ('SetUINT32',
         com.STDMETHOD(POINTER(GUID), c_uint32))
    ]

MFCreateAttributes = mfplat.MFCreateAttributes
MFCreateAttributes.restype = HRESULT
MFCreateAttributes.argtypes = [POINTER(POINTER(IMFAttributes)), c_uint32]

Что должно соответствовать рекомендациям Microsoft:

HRESULT MFCreateAttributes(
  IMFAttributes **ppMFAttributes,
  UINT32        cInitialSize
)

В основном один двойной указатель и int32.

Итак, я все инициализировал и создал так:

MF_LOW_LATENCY = com.GUID(0x9c27891a, 0xed7a, 0x40e1, 0x88, 0xe8, 0xb2, 0x27, 0x27, 0xa0, 0x24, 0xee)

MFStartup(MF_VERSION, 0)

attrib_config = POINTER(IMFAttributes)()
result = MFCreateAttributes(byref(attrib_config), 1)

attrib_config.contents.SetUINT32(byref(MF_LOW_LATENCY), 1)

результат возвращается как S_OK (0), но после попытки использования SetUINT32 я сразу получаю OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF

Я новичок в ctypes, поэтому любая помощь был бы очень признателен.

...