在 Python ctype 中从 C++ DLL 传递向量

passing vector from a c++ dll in python ctypes

本文关键字:向量 DLL C++ Python ctype 中从      更新时间:2023-10-16

我有一个用 c++ 编写的.dll,extern "C",这个函数称为 BOLHA 并返回一个双精度值。

问题是博尔哈在论点中有一个vector<double>

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

事实上,由于extern "C"我相信这个向量变成了一个指针,所以我尝试按如下方式加载函数。

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)   

但我收到以下错误。

[Error -529697949] Windows Error 0xE06D7363

事实上,由于外置"C",我相信这个向量变成了一个指针

这是错误的。默认情况下,没有任何机制可以使这成为可能。BOLHA()函数需要接收double*,然后将其转换为vector<double>或仅使用原始指针。

如果您希望它与vector<double>签名一起使用,则需要一些东西来完成将指针转换为矢量的工作。 boost::python可以做到这一点,但这需要您正在使用的DLL是一个python模块,而不仅仅是任何DLL。

如果您有以下功能:

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

您需要声明一个新函数:

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