python ctypes load dll返回新的malloc& d缓冲区

时间:2015-06-01 20:07:33

标签: python c dll ctypes dllexport

我使用python34 ctypes加载我在C中编写的DLL。使用python加载它的目的是对每个函数进行单元测试。存在三个函数和两个工作正常,但是,第三个函数调用malloc并返回指向该新缓冲区的指针。当我通过py.test运行python模块时,它传递返回int / void的两个但在返回指针的那个上失败。下面是我用于C和python的代码。

C代码是用cl.exe编译的 cl.exe / DLL /Fetests\test.dll src \ msg.c

DLLExport char * func2(char *message, unsigned int message_len) {

    int size = (message_len * 2);
    char *buf;
    buf = (char *)malloc(size);

    if(buf == NULL){
        return NULL;
    }

    return buf;
}

Python代码通过py.test执行,下面是test_msg.py模块中的一个函数

def test_message():
    lib = cdll.LoadLibrary("./tests/test_dll.dll")
    message = create_string_buffer(b"something")
    size = c_uint(9)
    func = lib.func2
    func.restype = POINTER(c_wchar_p)
    response = func(message, size)
    assert response.contents == b"somethingsomething"

我得到的错误是在malloc线上。如果我注释掉malloc,我会得到一个指向垃圾的指针,但它在python代码中正确断言。但是,如果malloc在,我得到以下错误:

OSError:异常:访问冲突写入0x00017B52

============================= test session starts =============================
platform win32 -- Python 3.4.3 -- py-1.4.28 -- pytest-2.7.1
rootdir: E:\test-windows, inifile:
collected 3 items

tests\test_func.py .F.

================================== FAILURES ===================================
_________________________________ test_func ___________________________________

    def test_message():
        lib = cdll.LoadLibrary("./tests/test_dll.dll")
        message = create_string_buffer(b"something")
        size = c_uint(9)
        func = lib.func2
        func.restype = POINTER(c_wchar_p)
>       response = func(message, domain)
E       OSError: exception: access violation writing 0x00017B52

tests\test_func.py:18: OSError
===================== 1 failed, 2 passed in 0.09 seconds ======================

1 个答案:

答案 0 :(得分:-1)

上述评论中的Eryksun解决了这个问题。

我没有正确编译C代码到