gpt4 book ai didi

c - CType 问题 - 调用 C dll 函数

转载 作者:行者123 更新时间:2023-11-30 16:20:32 27 4
gpt4 key购买 nike

我有从 dll 导出的以下 C 函数

typedef struct _TStubMethod
{
TBoolean stubAtEnd;
TBoolean longStub;
} TStubMethod;


int JpmcdsStringToStubMethod
(char *name,
TStubMethod *stubMethod
);

在Python中,我定义了类型和函数并调用该函数,如下所示:

class TStubMethod(Structure):
_fields_ = [
('stubAtEnd', c_int),
('longStub', c_int)
]

def JpmcdsStringToStubMethod(dll, name, stubmethod):
func = dll.JpmcdsStringToStubMethod
func.argtypes = [POINTER(c_char), POINTER(TStubMethod)]
func.restype = c_int
return func(name, stubmethod)

stubFS = TStubMethod(False, False)
ret = JpmcdsStringToStubMethod(dll, 'F/S', byref(stubFS))

我收到如下错误。我究竟做错了什么?

ArgumentError                             Traceback (most recent call last)
<ipython-input-61-ec7303283f89> in <module>
25
26 stubFS = TStubMethod(False, False)
---> 27 ret = JpmcdsStringToStubMethod(dll, 'F/S', byref(stubFS))

<ipython-input-55-c8ab0da16b04> in JpmcdsStringToStubMethod(dll, name, stubmethod)
9 func.argtypes = [POINTER(c_char), POINTER(TStubMethod)]
10 func.restype = c_int
---> 11 return func(name, stubmethod)

ArgumentError: argument 1: <class 'TypeError'>: wrong type

感谢您的帮助。

最佳答案

传递以零结尾的字符串时,请使用c_char_p。根据[Python 3]: class ctypes.c_char_p :

Represents the C char * datatype when it points to a zero-terminated string.

转换为您的代码:

  1. 更改函数argtypes(第一个):

    func.argtypes = [c_char_p, POINTER(TStubMethod)]
  2. 使用字节(Python相当于char*)。您可以其中一个(不能两者):

    • 字符串转换为字节(以保留JpmcdsStringToStubMethod中的更改):

      return func(name.encode(), stubmethod)
    • 字节实例传递给JpmcdsStringToStubMethod:

      ret = JpmcdsStringToStubMethod(dll, b"F/S", byref(stubFS))

关于c - CType 问题 - 调用 C dll 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55261990/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com