简体   繁体   中英

passing vector from a c++ dll in python ctypes

I have a .dll that was written in c++ with extern "C" , this function is called BOLHA and returns a double.

the problem is that BOLHA has a vector<double> in the argument.

extern "C" myDLL_API double BOLHA(vector<double> OI);

in fact due the extern "C" I believe that this vector turns into a pointer and so I tried to load the function as follows.

mydll = cdll.LoadLibrary("_DLL.dll")

func = mydll.BOLHA

func.argtypes = [POINTER(c_double)]
func.restype = c_double

returnarray = (c_double * 2)(0.047948, 0.005994)

func(returnarray)   

but I get the following error.

[Error -529697949] Windows Error 0xE06D7363

in fact due the extern "C" I believe that this vector turns into a pointer

This is wrong. there is no mechanism that makes this possible by default. Your BOLHA() function needs to receive a double* and then convert it to vector<double> or just use the raw pointer.

If you want this to work with the vector<double> signature, you needs something to do the work of converting the pointer to a vector. boost::python can do that but that would require that the DLL you're working with would be a python module and not just any DLL.

if you have the function:

extern "C" myDLL_API double BOLHA(vector<double> OI);

you'll need to declare a new function:

extern "C" myDLL_API double BOLHA_raw(double* ptr, int size) {
    vector<double> v(ptr, ptr+size);
    return BOLHA(v);
}

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM