Python win32 com:如何处理'out'参数?
我需要访问一个第三方的COM服务器,下面是它的接口定义(idl):
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 个回答
3
使用 makepy
模块,方法如下:
>>> import win32com.client.makepy as makepy
>>> makepy.main()
会弹出一个窗口,里面有一堆类型库的列表。你可以向下滚动,找到“Virtual Box Type Library”,选中它,然后点击“OK”。这样会在一个特定的位置生成一个Python模块,通常这个位置是 %TEMP%\gen_py\2.x\
。
生成的类会自动被 win32com.client.Dispatch
使用,但如果你需要明确地使用它,可以通过 win32com.client.gencache
模块里的函数来访问它。
8
既然这些是输出参数,你是不是可以直接这样做呢?
Framebuffer, XOrigin, YOrigin = display.getFrameBuffer(ScreenId)
在这里有一些不错的参考资料,来自于《Windows上Python编程》第12章 高级Python与COM
书中提到的语法应该像上面那样。他们还提到要使用MakePy来处理COM对象:
使用MakePy有几个很好的理由:(摘自书中)
对于由MakePy模块支持的对象,Python与自动化对象的接口速度更快。
类型库中定义的任何常量都可以在Python程序中使用。我们在本章后面会更详细地讨论COM常量。
对高级参数类型的支持要好得多,特别是COM声明为BYREF的参数只能与MakePy支持的对象一起使用。我们在本章后面会讨论如何传递参数。