我从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
感谢您的帮助。
答案 0 :(得分:0)
传递以零结尾的字符串时,请使用 c_char_p 。根据{{3}}:
表示C
char *
数据类型,该数据类型指向以零结尾的字符串。
已翻译为您的代码:
更改函数 argtypes (1个 st 一个):
func.argtypes = [c_char_p, POINTER(TStubMethod)]
使用 bytes (相当于char*
的 Python ))。您可以任一(都不可以两者):
将 string 转换为 bytes (以将更改保留在 JpmcdsStringToStubMethod 中):
return func(name.encode(), stubmethod)
将 bytes 实例传递给 JpmcdsStringToStubMethod :
ret = JpmcdsStringToStubMethod(dll, b"F/S", byref(stubFS))