如何将初始化的数组作为OUT参数传递给COM调用

2024-09-29 21:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个商业软件包,它有一个COM接口。我试图通过Python的COM接口来控制它。大多数情况下,正常的输入参数和输出都可以正常工作

然而,一组特定的函数似乎将预先分配的数据结构作为输入,然后用查询结果填充。So:此实例中的out参数类型为array

产品附带的一些有用的VBA代码示例以及Excel电子表格似乎工作得很好。它将输入数组声明为:Dim myArray(customsize) as Integer

然后将其直接传递到COM对象上的调用:cominterface.GetContent(myArray)

但是,当我在Python中尝试类似的操作时,根据我尝试传递数组的方式,可能会出现错误,也可能没有结果:

import comtypes
... code to generate bindings, create object, grab the interface ...

# create an array for storing the results
my_array_type = c_ulong * 1000
my_array_instance = my_array_type ()

# attempt to pass the array into the call on the COM interface
r = cominterface.GetContent(my_array_instance )

# expect to see id's 1,2,3,4
print(my_array_instance)

上面给了我一个错误:

TypeError: Cannot put <__main__.c_ulong_Array_1000 object at 0x00000282514F5640> in VARIANT

因此,comtypes似乎不支持ctype数组进行传递,因为它试图使其成为一个变体

因此,另一种尝试是:

# create an array for storing the results
my_array_instance = [0] * 100

# attempt to pass the array into the call on the COM interface
r = cominterface.GetContent(my_array_instance )

# expect to see id's 1,2,3,4
print(my_array_instance)

上面的调用有一个指示成功的返回代码,但是数组没有改变,仍然包含它所呈现的初始0

因此,我在这里假设comtypes没有以某种方式将写入的值传输回Python列表。但这是一个很大的假设——我真的不知道

我尝试了很多方法,包括使用指针、byref()和各种方法。几乎所有的事情都会导致某种错误——要么是执行绑定的代码中的错误,要么是我调用的COM函数中的错误,即参数不符合其要求

如果有人知道我如何为这个COM函数传递一个预先分配的数组,我将非常感激

编辑:

我用C#重写了代码,但它也有同样的问题,所以我开始怀疑COM接口不正确。通过为我自己的接口提供修改过的函数签名(为参数添加一个“ref”),我能够让调用正常工作

我怀疑tlb文件出错,并且碰巧与VBA一起工作,但我不确定


Tags: thetoinstance函数代码com参数my

热门问题