2009-06-30 58 views
5

我需要下面的接口定义(IDL)来访问第三方COM服务器:Python win32 com:如何处理'out'参数?

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)

回答

8

因为那些是出参数,你不能简单地执行以下操作吗?

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

有一个在Python Programming on Win32 Chapter 12 Advanced Python and COM

一些很好的标记,表明该语法应该是像上面。他们还提到使用 MakePy COM对象:

有使用许多很好的理由MakePy:(从书上抄)

  • 的Python接口自动化对象通过为对象更快支持一个MakePy模块。

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

  • 对高级参数类型有更好的支持,特别是由COM声明的参数,因为BYREF只能与MakePy支持的对象一起使用。本章稍后会讨论传递参数。

+0

我试过了,它会引起“无效的参数数目”。如果COM服务器是第三方,我不确定如何使用MakePy。它作为二进制文件安装在系统上并注册COM服务器。是否有可能改变它的API? – grigoryvp 2009-06-30 08:14:10

3

使用makepy模块,调用它,如下所示:

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

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

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