[英]Passing pointer to DLL via Ctypes in Python
我正在嘗試使用Python與我創建的DLL中的“ ReturnBuffer”函數進行接口,並遇到了緩沖區值似乎未被該函數修改的問題。 “ ReturnBuffer”函數采用兩個參數,即緩沖區的長度和指向緩沖區的指針,我想知道是否正確地傳遞了指針。 我編寫了c函數,如下所示:
__declspec(dllexport) int ReturnBuffer (int num_numbers, unsigned __int32 *buffer);
int ReturnBuffer (int num_numbers, unsigned __int32 *buffer)
{
int i;
for (i = 0; i < num_numbers; i++) {
buffer[i] = buffer[i] + i ;
}
return 1;
}
我使用下面的python代碼加載DLL:
_file = 'MyMathDLL.dll'
_path = os.path.join(*(os.path.split(__file__)[:-1] + (_file,)))
_math = ctypes.cdll.LoadLibrary(_path)
然后,我創建一個1的數組並將該數組的長度和該數組的指針傳遞給函數“ ReturnBuffer”,我期望該函數將采用該指針並修改緩沖區中的值。
_math.ReturnBuffer.restype = ctypes.c_int
_math.ReturnBuffer.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_uint32)]
nelem = 10
variable = ctypes.c_double(10.0)
Buffer_Type = ctypes.c_uint32 * nelem
Buffer = (1,1,1,1,1,1,1,1,1,1)
print(_math.ReturnBuffer(ctypes.c_int(nelem),Buffer_Type(*Buffer)))
print(Buffer)
Screen Output:
1
(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
Process finished with exit code 0
數組初始化在docs中進行了描述: https : //docs.python.org/2/library/ctypes.html
嘗試這個:
Buffer = (ctypes.c_uint32 * nelem)()
for i in range(0, nelem):
Buffer[i] = 1
print(_math.ReturnBuffer(nelem, Buffer))
print(Buffer)
或這個:
Buffer = (ctypes.c_uint32 * nelem)(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
print(_math.ReturnBuffer(nelem, Buffer))
print(Buffer)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.