我希望对ctypes结构和指针有所帮助。
这是我的C代码签名
typedef struct ApiReturn
{
int error;
char* errorMessage;
} ApiReturn;
// if this call fails, we'll declare instantiate the errorMessage pointer and
// set the appropriate value for error.
ApiReturn DoSomething();
// this frees the memory in clear.
void Api_Clear(char* clear);
这里是ctypes代码:
class ApiReturn(Structure):
_fields_ = [('error', c_int),
('errorMessage', c_char_p)]
def check_api_return(api_return):
# 0 means api call succeeded.
if api_return.error != 0:
get_global_lib().Api_Clear(api_return.errorMessage)
raise Exception('API call failed with' + api_return.errorMessage)
do_something = get_global_lib().DoSomething
do_something.restype = ApiReturn
这个python代码是错误的,因为api_return.errorMessage已经实例化了一个新的python字符串,但是我无法直接通过 field 成员访问指针errorMessage。
库的其余部分正如预期的那样工作。我对这个问题有任何帮助表示感谢。
答案 0 :(得分:0)
我会花更多时间研究它,然后回答我自己的问题。事实证明我需要以不同方式定义python结构才能访问指针。
class ApiReturn(Structure):
_fields_ = [('error', c_int),
('errorMessage', POINTER(c_char))]
cp = pointer(api_return).contents.errorMessage
error_msg = cast(cp, c_char_p).value
get_global_lib().Api_Clear(cp)