我需要使用以下接口定义(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])
答案 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
模块中的函数访问它。