<p>我对您的代码做了一些小的修改,使实际运行(导入),并添加了一个打印来查看传递的对象的地址和返回值,另外还创建了一个等效的C DLL来确保指针正确传递和回调正常工作。在</p>
<p>Python:</p>
<pre><code>import ctypes
import math
def SimpleTestFunction_asm(X):
Input_Length_Array = []
Input_Length_Array.append(len(X)*8)
CA_X = (ctypes.c_double * len(X))(*X)
length_array_out = (ctypes.c_double * len(Input_Length_Array))(*Input_Length_Array)
hDLL = ctypes.WinDLL('test')
CallName = hDLL.Main_Entry_fn
CallName.argtypes = [ctypes.POINTER(ctypes.c_double),ctypes.POINTER(ctypes.c_double),ctypes.POINTER(ctypes.c_longlong)]
CallName.restype = ctypes.POINTER(ctypes.c_int64)
LibraryCB = ctypes.WINFUNCTYPE(ctypes.c_double, ctypes.c_double)
def LibraryCall(ax):
bx = math.ceil(ax)
return (bx)
lib_call = LibraryCB(LibraryCall)
lib_call = ctypes.cast(lib_call,ctypes.POINTER(ctypes.c_longlong))
ret_ptr = CallName(CA_X,length_array_out,lib_call)
print('{:016X} {:016X} {:016X} {}'.format(ctypes.addressof(CA_X),ctypes.addressof(length_array_out),ctypes.addressof(lib_call.contents),ret_ptr.contents))
SimpleTestFunction_asm([1.1,2.2,3.3])
</code></pre>
<p>在测试.DLL资料来源:</p>
^{pr2}$
<p>输出:</p>
<pre><code>0000021CC99B23A8 0000021CCBADAC10 0000021CCBC90FC0 2.000000
0000021CC99B23A8 0000021CCBADAC10 0000021CCBC90FC0 c_longlong(123)
</code></pre>
<p>您可以看到指针是相同的,回调返回值和函数返回值是正确的。在</p>
<p>很可能您的NASM代码没有正确实现调用约定,或者破坏了访问数组的堆栈。我只是做了最起码的工作来让你的Python代码正常工作。我确实觉得奇怪,<code>length_array_out</code>总是一个长度为1的双数组,其值是输入数组<code>X</code>长度的8倍。NASM代码如何知道数组的长度?在</p>
<p>{and可以声明一个回调函数来代替cd3}类型转换:</p>
<pre><code>CALLBACK = ctypes.WINFUNCTYPE(ctypes.c_double, ctypes.c_double)
CallName.argtypes = [ctypes.POINTER(ctypes.c_double),ctypes.POINTER(ctypes.c_double),CALLBACK]
CallName.restype = ctypes.POINTER(ctypes.c_int64)
@CALLBACK
def LibraryCall(ax):
bx = math.ceil(ax)
return (bx)
ret_ptr = CallName(CA_X,length_array_out,LibraryCall)
</code></pre>