CTypes问题-调用C dll函数

时间:2019-03-20 13:34:50

标签: c python-3.x ctypes

我从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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

传递以零结尾的字符串时,请使用 c_char_p 。根据{{​​3}}:

  

表示C char *数据类型,该数据类型指向以零结尾的字符串。

已翻译为您的代码:

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

    func.argtypes = [c_char_p, POINTER(TStubMethod)]
    
  2. 使用 bytes (相当于char* Python ))。您可以任一(都不可以两者):

    • string 转换为 bytes (以将更改保留在 JpmcdsStringToStubMethod 中):

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

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