Приведение интерфейса Pythoncom - PullRequest
0 голосов
/ 25 мая 2018

Я хотел бы подключиться к удаленному процессу с запущенным экземпляром Visual Studio, используя pythoncom и COM-объекты, предоставленные средой разработки Microsoft.Пока что я могу получить от DTE-объект отладчик объект, реализующий Отладчик интерфейс.Однако мне нужно получить доступ к свойству Transports отладчика.Реализуется классом Debugger2 .Так что почему-то мне нужен экземпляр Debugger2 вместо Debugger.В VB или C ++ это можно сделать простым приведением ( DTE -> DTE2 ).Но как это можно сделать в Python?

QueryInterface

Подход заканчивается с исключением

IID_DTE2 = IID("{2EE1E9FA-0AFE-4348-A89F-ED9CB45C99CF}")

def get_vs_instances():
    rot = pythoncom.GetRunningObjectTable()
    running_objects = rot.EnumRunning()

    while True:
        moniker = running_objects.Next()

        if not moniker:
            break

        ctx = pythoncom.CreateBindCtx(0)
        name = moniker[0].GetDisplayName(ctx, None)

        if name.startswith("!VisualStudio.DTE."):
            obj = rot.GetObject(moniker[0])
            dte = win32com.client.Dispatch(
                obj.QueryInterface(pythoncom.IID_IDispatch))
            dte2 = dte._oleobj_.QueryInterface(IID_DTE2)

Ошибка типа: Нет интерфейсазарегистрированный объект, который поддерживает этот IID

Invoke

(я взял DISPID 1101 свойства Transports из браузера объектов Python.)

transports = dte.Debugger._oleobj_.Invoke(1101, 0x400, pythoncom.DISPATCH_PROPERTYGET, True)

pywintypes.com_error: (-2147352573, 'Участник не найден.', Нет, нет)

CastTo также не помогает из-за ошибки интерфейс не отображается в той же библиотеке, что и объект. (похожая проблема)

Есть предложения?

...