从PyIUknown类型变量中读取数据

时间:2018-03-09 15:11:25

标签: python vb.net com pywin32 win32com

我正在使用win32com.client从VB.Net开发的自定义COM对象中读取数据。

使用以下代码,我能够读取字符串结果

>>> import win32com.client
>>> cstApp = win32com.client.Dispatch("CustomLib.CSTApp")
>>> string = cstApp.GiveMeTestString()
>>> print(type(string))
<class 'str'>
>>> print("Test String: {0}".format(string))
Test String: Well done! I come from COM Object

我现在有一个方法可以提供一个VB.Net字典类型,但是当我尝试从我的python脚本中读取它时,我得到一个PyIUknown类型,我无法读取它的值

>>> username = 'artur'
>>> resultset = cstApp.OpenTaskforUser(username)
>>> print(type(resultset))
<class 'PyIUnknown'>
>>> print(resultset)
<PyIUnknown at 0x0000003C47ABAC30 with obj at 0x0000003C47EAFF18>

我如何阅读它的数据?

否则,我需要在VB.Net中使用哪种类型才能读取包含win32com词典的Python列表?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

经过一周的工作后,我更好地理解了win32com如何工作以及Python对COM接口的支持,所以我想分享我曾经用过的解决方法,以避免我发布这个问题的情况问题

<强> 1。首先 PyIUnknown 不是错误。 IUnknown接口是从哪个派生所有其他接口的根接口。 IUnknown(以及PyIUnknown)可以通过QueryInterface方法使用。 [1]

<强> 2。另一方面,并​​非所有Python类型都映射到COM接口。所以IDictionary就是其中之一。这就是我得到PyIUnknown结果的原因。 [2]

第3。为了方便地使用,Python中的COM接口对于生成静态代理类非常有用,它可以映射库中可用的所有接口。有不同的方法来完成这项活动。在早期的步骤中,我使用了makepy方法。然后我使用了EnsureDispatch一个。 [3]

为了避免第1点和第2点的问题,最后的解决方法是要求自定义API COM开发人员将返回的类型从IDictionary更改为JSON字符串。

通过这种方式,我可以轻松使用Python词典。

>>> import win32com.client
>>> import json
>>> cstApp = win32com.client..gencache.EnsureDispatch("CustomLib.CSTApp")
>>> resultset_json = cstApp.OpenTaskforUser('artur')
>>> type(resultset_json)
<class 'str'>
>>> resultset = json.loads(resultset_json)
>>> type(resultset)
<class 'dict'>

我希望这个答案可以帮助其他人。