Python win32 com:如何处理'out'参数?

时间:2009-06-30 07:00:51

标签: python com

我需要使用以下接口定义(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])

2 个答案:

答案 0 :(得分:8)

由于那些是参数,你不能简单地做以下几点吗?

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

Python Programming on Win32 Chapter 12 Advanced Python and COM

中有一些很好的参考资料

他们表示语法应如上所述。他们还提到使用 MakePy for COM对象:

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

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

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

  • 对高级参数类型有更好的支持,具体而言,COM声明的参数作为BYREF只能用于支持MakePy的对象。我们将在本章后面讨论传递参数。

答案 1 :(得分:3)

使用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模块中的函数访问它。