【问题标题】:Read data from PyIUknown type variable从 PyIUknown 类型变量中读取数据
【发布时间】:2018-08-18 04:48:20
【问题描述】:

我正在使用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 列表?

感谢您的帮助。

【问题讨论】:

    标签: python vb.net com pywin32 win32com


    【解决方案1】:

    经过一周的工作,我更好地理解了win32com 的工作原理以及 COM 接口的 Python 支持,所以我想分享一下我用来避免我发布此问题的情况的解决方法。

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

    2。另一方面,并​​非所有 Python 类型都映射到 COM 接口。所以字典就是其中之一。这就是我得到 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'>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多