我使用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
提前感谢您的帮助。
答案 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中数组的正确方法。
非常感谢,马克