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

5 投票
2 回答
4285 浏览
提问于 2025-04-15 12:35

我需要访问一个第三方的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支持的对象一起使用。我们在本章后面会讨论如何传递参数。

撰写回答