【问题标题】:Python win32 com : how to handle 'out' parameter?Python win32 com:如何处理“out”参数?
【发布时间】:2017-12-01 10:06:59
【问题描述】:

我需要访问具有以下接口定义(idl)的第三方 COM 服务器:

interface IDisplay : IDispatch
{
  HRESULT getFramebuffer (
    [in] ULONG aScreenId,
    [out] IFramebuffer * * aFramebuffer,
    [out] LONG * aXOrigin,
    [out] LONG * aYOrigin );
};

如您所见,它通过 [out] 参数修饰符返回 3 个值。如何通过 python win32 COM api 处理这个?例如,我创建一个对象并从中获取 IDisplay:

object = win32com.client.Dispatch( "VirtualBox.VirtualBox" )
display = object.display

如何调用 display.getFrameBuffer() 让它工作?我尝试了不同的方法,但第二个参数总是“类型不匹配”(IFrameBuffer 的 [out])

【问题讨论】:

    标签: python com


    【解决方案1】:

    既然这些都是out参数,你就不能简单的做以下吗?

    Framebuffer, XOrigin, YOrigin = display.getFrameBuffer(ScreenId)
    

    Python Programming on Win32 Chapter 12 Advanced Python and COM中有一些很好的参考

    它们表明语法应该像上面那样。他们还提到使用 用于 COM 对象的 MakePy:

    使用 MakePy 有很多很好的理由:(从书中复制)

    • 自动化对象的 Python 接口对于 MakePy 模块支持的对象来说更快。

    • 类型库定义的任何常量都可用于 Python 程序。我们将在本章后面更详细地讨论 COM 常量。

    • 对高级参数类型的支持要好得多,具体来说,由 COM 声明为 BYREF 的参数只能用于 MakePy 支持的对象。我们将在本章后面讨论传递参数。

    【讨论】:

    • 我试过了,它会引发“无效的参数数量”。如果 COM 服务器是第三方的,我不确定如何使用 MakePy。它作为二进制文件安装在系统上并注册 COM 服务器。是否可以更改它的 API?
    【解决方案2】:

    使用makepy 模块,调用如下:

    >>> import win32com.client.makepy as makepy
    >>> makepy.main()
    

    将打开一个包含类型库列表的窗口。滚动到“Virtual Box Type Library”并选择它,然后单击“OK”。将在打印输出的位置(通常为 %TEMP%\gen_py\2.x\)创建 Python 模块。

    win32com.client.Dispatch 将自动使用生成的类,但如果您明确需要它,您可以通过 win32com.client.gencache 模块中的函数访问它。

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 2014-04-12
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2015-02-03
      • 2022-01-22
      • 1970-01-01
      • 2010-10-25
      相关资源
      最近更新 更多