我使用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 ======================
答案 0 :(得分:-1)
上述评论中的Eryksun解决了这个问题。
我没有正确编译C代码到