如何使用ctypes读取具有自定义结构的dll的输出?

安德鲁·D

我正在使用一个名为CL3_IF.dll的DLL,其文档中将其描述为:

格式:CL3IF_VERSION_INFO CL3IF_GetVersion(无效)

参数:—

返回值:返回此DLL的版本。

typedef struct {
 INT majorNumber;
 INT minorNumber;
 INT revisionNumber;
 INT buildNumber;
} CL3IF_VERSION_INFO;

说明:此函数获取DLL版本。

我使用了以下python代码:

import ctypes
CLP=ctypes.WinDLL('CL3_IF.dll')
class CLIF_VERSION_INFO(ctypes.Structure):
    _fields_ = [("majorNumber", ctypes.c_int),
                ("minorNumber", ctypes.c_int),
                ("revisionNumber", ctypes.c_int),
                ("buildNumber", ctypes.c_int)]
CLP.CL3IF_GetVersion(ctypes.c_void_p, CLIF_VERSION_INFO)

当我运行上面的代码时,出现以下错误:

ArgumentError: argument 1: <class 'TypeError'>: Don't know how to convert parameter 1

我希望能够以可用的形式获取版本信息,并且dll的许多其他功能以复杂的结构提供其输出。

最复杂的功能,我将使用将是这个

如果有人知道我将如何阅读此输出,我将不胜感激。

马克·托洛宁

返回的结构是返回值,而不是参数,并且void表示没有参数,而c_void_p表示void*参数。确保设置.argtypes.restype正确。

另请注意,这WinDLL是针对32位__stdcallAPI的。使用CDLL__cdecl(C调用约定)的API。在64位Python上,两者都可以使用,因为只有一种调用约定,但是对于可移植代码,请使用正确的调用约定。

完整示例如下:

测试文件

#ifdef _WIN32
#   define API __declspec(dllexport)
#else
#   define API
#endif

typedef int INT;

typedef struct {
    INT majorNumber;
    INT minorNumber;
    INT revisionNumber;
    INT buildNumber;
} CL3IF_VERSION_INFO;

extern "C"
{

API CL3IF_VERSION_INFO CL3IF_GetVersion(void) {
    CL3IF_VERSION_INFO info = {1,2,3,4};
    return info;
}

}

test.py

import ctypes

class CLIF_VERSION_INFO(ctypes.Structure):

    _fields_ = [("majorNumber", ctypes.c_int),
                ("minorNumber", ctypes.c_int),
                ("revisionNumber", ctypes.c_int),
                ("buildNumber", ctypes.c_int)]

    def __repr__(self):
        return f'CLIF_VERSION_INFO(major={self.majorNumber},minor={self.minorNumber},rev={self.revisionNumber},build={self.buildNumber})'

dll = ctypes.CDLL('./test')
dll.CL3IF_GetVersion.argtypes = ()
dll.CL3IF_GetVersion.restype = CLIF_VERSION_INFO

print(dll.CL3IF_GetVersion())

输出:

CLIF_VERSION_INFO(major=1,minor=2,rev=3,build=4)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用 jquery ajax 发布具有自定义 json 结构的数据?

来自分类Dev

JNA:如何定义具有自定义位大小的字段的结构?

来自分类Dev

如何在c中使用自定义类型从节点列表中读取数据结构

来自分类Dev

具有自定义结构的PInvoke访问冲突异常

来自分类Dev

具有char成员的结构的自定义memcmp()

来自分类Dev

如何在Simulink中将具有数组的结构赋予自定义C代码函数?

来自分类Dev

元帅无法使用具有自定义大小的枚举字段的结构

来自分类Dev

具有自定义输出的条件聚合

来自分类Dev

如何在Keras中实现具有动态形状的自定义输出层?

来自分类Dev

如何在具有自定义循环和自定义设计的wordpress上使用同位素?

来自分类Dev

如何使用MPI传递带有动态数组的自定义结构?

来自分类Dev

在 Python 中使用 Ctypes 读取 Dll 的双 c 结构

来自分类Dev

如何在同一层次结构上具有页面和自定义帖子类型

来自分类Dev

使用DeliciousPie的自定义输出XML(带有属性)?

来自分类Dev

如何在C#项目中构建具有自定义文件扩展名的DLL?

来自分类Dev

如何使用Python读取Blender中的自定义属性?

来自分类Dev

如何使用NSLog输出自定义类型的值?

来自分类Dev

如何评估具有自定义属性的自定义管道组件?

来自分类Dev

具有样式的自定义WPF ListView(使用DataTemplate)-如何添加标题?

来自分类Dev

如何使用TensorBoard可视化具有自定义模型子类的keras模型?

来自分类Dev

如何使用blazor中的syncfusion获得具有自定义操作列的选定行?

来自分类Dev

如何在具有TensorFlow概率的自定义函数上使用MCMC采样

来自分类Dev

如何在具有自定义传输的客户端上使用go-retryablehttp?

来自分类Dev

具有样式的自定义WPF ListView(使用DataTemplate)-如何添加标题?

来自分类Dev

如何在Highcharts中使用具有默认打印选项的自定义下载按钮?

来自分类Dev

如何在具有不同内容的控制器中多次使用自定义UIView?

来自分类Dev

如何使用cglib生成具有自定义字段的代理?

来自分类Dev

如何使用自动映射器映射具有多个自定义属性类型的类

来自分类Dev

如何使用jquery旋转和停止轮子具有自定义位置

Related 相关文章

  1. 1

    如何使用 jquery ajax 发布具有自定义 json 结构的数据?

  2. 2

    JNA:如何定义具有自定义位大小的字段的结构?

  3. 3

    如何在c中使用自定义类型从节点列表中读取数据结构

  4. 4

    具有自定义结构的PInvoke访问冲突异常

  5. 5

    具有char成员的结构的自定义memcmp()

  6. 6

    如何在Simulink中将具有数组的结构赋予自定义C代码函数?

  7. 7

    元帅无法使用具有自定义大小的枚举字段的结构

  8. 8

    具有自定义输出的条件聚合

  9. 9

    如何在Keras中实现具有动态形状的自定义输出层?

  10. 10

    如何在具有自定义循环和自定义设计的wordpress上使用同位素?

  11. 11

    如何使用MPI传递带有动态数组的自定义结构?

  12. 12

    在 Python 中使用 Ctypes 读取 Dll 的双 c 结构

  13. 13

    如何在同一层次结构上具有页面和自定义帖子类型

  14. 14

    使用DeliciousPie的自定义输出XML(带有属性)?

  15. 15

    如何在C#项目中构建具有自定义文件扩展名的DLL?

  16. 16

    如何使用Python读取Blender中的自定义属性?

  17. 17

    如何使用NSLog输出自定义类型的值?

  18. 18

    如何评估具有自定义属性的自定义管道组件?

  19. 19

    具有样式的自定义WPF ListView(使用DataTemplate)-如何添加标题?

  20. 20

    如何使用TensorBoard可视化具有自定义模型子类的keras模型?

  21. 21

    如何使用blazor中的syncfusion获得具有自定义操作列的选定行?

  22. 22

    如何在具有TensorFlow概率的自定义函数上使用MCMC采样

  23. 23

    如何在具有自定义传输的客户端上使用go-retryablehttp?

  24. 24

    具有样式的自定义WPF ListView(使用DataTemplate)-如何添加标题?

  25. 25

    如何在Highcharts中使用具有默认打印选项的自定义下载按钮?

  26. 26

    如何在具有不同内容的控制器中多次使用自定义UIView?

  27. 27

    如何使用cglib生成具有自定义字段的代理?

  28. 28

    如何使用自动映射器映射具有多个自定义属性类型的类

  29. 29

    如何使用jquery旋转和停止轮子具有自定义位置

热门标签

归档