Python | ctypes结构返回指针

时间:2015-08-20 16:20:01

标签: python ctypes

我希望对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。

库的其余部分正如预期的那样工作。我对这个问题有任何帮助表示感谢。

1 个答案:

答案 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)