首页 > 解决方案 > Pythoncom 接口转换

问题描述

我想使用Microsoft 开发环境提供的pythoncom和 COM 对象附加到一个正在运行的 Visual Studio 实例的远程进程。到目前为止,我能够从DTE 对象获取实现Debugger接口的调试器对象。但是,我需要访问调试器的Transports属性。它由Debugger2类实现。所以不知何故,我需要 Debugger2 实例而不是 Debugger。在 VB 或 C++ 中,这可以通过简单的强制转换 ( DTE -> DTE2 ) 来完成。但是如何在 Python 中做到这一点呢?

查询接口

方法以异常结束

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)

TypeError: 没有注册支持此 IID 的接口对象

调用

(我从 Python 对象浏览器中获取了 Transports 属性的 DISPID 1101。)

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

pywintypes.com_error:(-2147352573,'未找到成员。',无,无)

CastTo也没有帮助,因为错误接口没有出现在与对象相同的库中。 (类似问题)

有什么建议么?

标签: pythonenvdtepythoncom

解决方案


推荐阅读