我需要以下的接口定义(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(),所以它是否行得通呢? 我曾尝试不同的方式,但它总是在第二个参数“类型不匹配”([OUT]为IFrameBuffer)
因为这些是输出参数,不能你根本就以下?
Framebuffer, XOrigin, YOrigin = display.getFrameBuffer(ScreenId)
有一些很好的参考Python编程在Win32第12章高级Python和COM
他们表明,语法应该是像上面。 他们还提到使用MakePy COM对象:
有两种使用了一些很好的理由MakePy:(从书上抄)
Python的接口自动化对象是由MakePy模块支持的对象更快。
由类型库中定义的任何常量提供给Python程序。 我们更详细地本章的后面讨论COM常数。
有作为BYREF只能MakePy支持对象可用于高级参数类型,具体而言,通过COM申报参数更好的支持。 我们讨论本章稍后传递参数。
使用makepy
模块,调用它,如下所示:
>>> import win32com.client.makepy as makepy
>>> makepy.main()
一个窗口将与类型库的列表中打开。 滚动到“虚拟框类型库”并选择它,然后单击“确定”。 甲Python模块将在其上打印出一个位置(通常被创建%TEMP%\gen_py\2.x\
)。
生成的类会自动使用win32com.client.Dispatch
,但如果你需要它明确可以在经由功能访问win32com.client.gencache
模块。