我已经将我的代码缩短为一个最小的用例。在
脚本总是会完成,但大约50%的时间它会导致内存访问冲突/崩溃。在
这是在Windows7上使用64位的Python3
这段代码应该遍历7zip的所有处理程序,并说明它们支持哪些扩展(一个空格分隔的列表,可能是空的。。。不是空的,只是bstrVal=L“”)
#!/usr/bin/python
from cffi import FFI
ffi = FFI()
ffi.cdef("""
typedef struct PROPVARIANT {
unsigned short vt;
unsigned short wReserved1;
unsigned short wReserved2;
unsigned short wReserved3;
union {
int intVal;
wchar_t* bstrVal;
/* shortened for clarity */
};
} PROPVARIANT;
typedef unsigned long long HRESULT;
typedef uint32_t PROPID;
HRESULT GetNumberOfFormats(uint32_t * numFormats);
HRESULT GetHandlerProperty2(uint32_t index, PROPID propID, PROPVARIANT * value);
""")
S_OK = 0x00000000 # Operation successful
VT_BSTR = 8
kExtension = 2
dll7z = ffi.dlopen('7z.dll')
num_formats = ffi.new('uint32_t*')
assert dll7z.GetNumberOfFormats(num_formats) == S_OK
print(num_formats[0])
tmp_pvar = ffi.new('PROPVARIANT*')
for i in range(num_formats[0]):
assert dll7z.GetHandlerProperty2(i, kExtension, tmp_pvar) == S_OK
assert tmp_pvar != ffi.NULL
assert tmp_pvar[0].vt == VT_BSTR
print(ffi.string(tmp_pvar[0].bstrVal))
令人恼火的是,等效的ctypes
代码似乎可以正常工作。在
好的,这看起来像一个CFFI错误。在
如果我手动使用malloc/free/memset,它可以正常工作。在
代码:
相关问题 更多 >
编程相关推荐