Я хотел бы подключиться к удаленному процессу с запущенным экземпляром 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 также не помогает из-за ошибки интерфейс не отображается в той же библиотеке, что и объект. (похожая проблема)
Есть предложения?