CTypes:将指针传递给数组时出错

时间:2018-01-19 19:50:46

标签: python pointers ctypes

我使用CTypes将一个双精度数组传递给DLL。代码如下。

我需要传递一个指向数组的指针。我试图以四种不同的方式传递它,如代码所示。为简单起见,我传递了相同的数组三次。

TestArrayType = ctypes.c_double * 1000
arrNew = TestArrayType()

hDLL = ctypes.WinDLL(r"C:/NASM_Test_Projects/Test_Project_Full2/Std_Math_Formulas.dll")

CallTest = hDLL.TryThemAll

CallTest.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double)]

CallTest.restype = ctypes.c_int64

t = type(arrNew)

#Call #1
#ptrA = ctypes.cast(arrNew, ctypes.POINTER(ctypes.c_double))
#retvar = CallTest(ptrA, ptrA, ptrA)

#Call #2
#retvar = CallTest(ctypes.pointer(arrNew), ctypes.pointer(arrNew), ctypes.pointer(arrNew))

#Call #3
#retvar = CallTest(ctypes.POINTER(arrNew), ctypes.POINTER(arrNew), ctypes.POINTER(arrNew))

#Call #4
retvar = CallTest(arrNew, arrNew, arrNew)

上面的四个不同的调用给出以下错误消息:

致电#1: 消息=异常:访问冲突读取0x000000000000000D

致电#2: ctypes.ArgumentError:参数1 ::预期的LP_c_double实例而不是LP_c_double_Array_1000

致电#3: 必须是ctypes类型

致电#4: Message = exception:访问冲突读取0xFFFFFFFFFFFFFFFF

所以我还没做对。我已经做了很多研究,但我仍然没有找到将指针传递给数组的正确方法。

表达式t = type(arrNew)中的t值为:
t = class Trans_01_Samples_04.c_double_Array_1000

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Mark Tolonen是对的 - #4确实有效,问题出在我的DLL代码中。代码在NASM中,并确认我创建了一个超级简单的DLL,它接受了数组指针并返回了预期的值。

记录中,这是新的简化代码:

; Header Section
[BITS 64]

export TryThemAll

section .data

section .text

TryThemAll:
push rdi
push rbp
mov rdi,[rcx]
pop rbp
pop rdi
ret

现在我正在为大得多的NASM dll代码进行运行时调试。

为了将来其他Stack Overflow读者使用,这篇文章确认了将指针传递给CTypes中数组的正确方法。

非常感谢,马克