我正在使用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列表?
感谢您的帮助。
答案 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'>
我希望这个答案可以帮助其他人。