I have a python file from which i want to call a function from a dll.
The prototype of the function is :
typedef double real_T;
extern real_T __declspec(dllexport) RectIntersect(const real_T rect1[8], const real_T rect2[8]);
The python code:
import math;
import ctypes;
from ctypes import *
import numpy;
# this module shall always be executed directly
if __name__ == '__main__':
print "Program started !";
rect = ctypes.c_double * 8;
rect1 = rect(1.1, 2.45, 3, 4, 5, 6, 7, 8);
rect2 = rect(1.6, 3.45, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1);
# Load DLL into memory.
hllDll = ctypes.WinDLL ("IntersectDLL.dll");
hllDll.RectIntersect.argtypes =[ctypes.c_double * 8, ctypes.c_double * 8];
hllDll.RectIntersect (rect1, rect2);
I get the error:
Traceback (most recent call last):
File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Python Tools for Visual Studio\2.0\visualstudio_py_util.py", line 70, in exec_file
exec(code_obj, global_variables)
File "D:\Sandboxes\SRR2T0\06_Algorithm\05_Testing\05_Test_Environment\algo\smr200_bbt\valf_tests\adma\test.py", line 18, in <module>
hllDll.RectIntersect (rect1, rect2);
ValueError: Procedure probably called with too many arguments (8 bytes in excess)
Please help :(. ....
The C declaration
real_T RectIntersect(const real_T rect1[8], ...)
is completely equivalent to (and replaced by the C compiler with):
real_T RectIntersect(const real_T *rect1, ...)
This means the function in the DLL is not actually expecting an array of 8 doubles, but a pointer to a double, which might be followed by 7 more to make an array of 8 of them (but this part is not checked). It means that you need other ways to write it with ctypes; for example:
hllDll.RectIntersect.argtypes =[ctypes.POINTER(ctypes.c_double * 8),...]
and pass it with ctypes.byref(rect1)
.
Alternatively: you may not have this problem with CFFI ( http://cffi.readthedocs.org/ ) instead of ctypes, which matches more closely the C types:
import cffi
ffi = cffi.FFI()
ffi.cdef("""
typedef double real_T;
real_T RectIntersect(const real_T rect1[8], const real_T rect2[8]);
""")
lib = ffi.dlopen("IntersectDLL.dll")
rect1 = ffi.new("real_T[8]", [1.1, 2.45, 3, 4, 5, 6, 7, 8])
rect2 = ffi.new("real_T[8]", [1.6, 3.45, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1])
lib.RectIntersect(rect1, rect2)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.