从C++ DLL返回动态分配的数组到VBA

从C++ DLL返回动态分配的数组到VBA,c++,arrays,vba,dynamic-arrays,dynamic-allocation,C++,Arrays,Vba,Dynamic Arrays,Dynamic Allocation,免责声明:我知道如何在VBA中分配内存,在C++ DLL中填充数组并返回指针,但很遗憾的是,我可能发现一些情况下,我无法知道数组的大小,因此在将其传递给DLL之前,我不能在VBA中对其进行调暗或重写。 假设我的DLL中有一个C++子程序,它将返回两个事物作为输出:一个是整数,另一个是数组: void _stdcall mySub(int inOption, int outXPR, double* outWeight_Coeff) // Do Stuff WindowThetaHalf =

免责声明:我知道如何在VBA中分配内存,在C++ DLL中填充数组并返回指针,但很遗憾的是,我可能发现一些情况下,我无法知道数组的大小,因此在将其传递给DLL之前,我不能在VBA中对其进行调暗或重写。

假设我的DLL中有一个C++子程序,它将返回两个事物作为输出:一个是整数,另一个是数组:

void _stdcall mySub(int inOption, int outXPR, double* outWeight_Coeff)

// Do Stuff 

WindowThetaHalf = [insert random value here];
WindowPhiHalf = [insert random value here];
outXPR = value;

outWeight_Coeff = new double[(WindowThetaHalf + 1) * (WindowPhiHalf + 1)];

for (int i = -WindowThetaHalf; i <= WindowThetaHalf; i++)
{
    for (int j = -WindowPhiHalf; j <= WindowPhiHalf; j++)
    {
        outWeight_Coeff[i + WindowThetaHalf + j * (WindowThetaHalf + 1) * 2 + WindowPhiHalf] = i + j;
    }
}
但这不起作用。我觉得它可能与我在VBA中指定的维度有关,但是同样,我很可能必须处理一种情况,在这种情况下,我基本上必须重新计算C++中的OutWeithOyCoff数组。 有没有可能这样做

编辑:我尝试过但失败的其他方法:

我没有使用new,而是尝试了以下方法:

使用malloc:

创建新数组并为其分配指针:

double* newArr = new double [(WindowThetaHalf + 1) * (WindowPhiHalf + 1)];
outWeight_Coeff = newArr;
C++原型:

void __stdcall mySub(int inOption, int outXPR, VARIANT *outWeight_Coeff)
Private Declare Sub mySub Lib "[dll path here]" (ByVal inOption As Long, ByVal XPR As Long, ByRef outWeight_Coeff As Variant)
VBA原型:

void __stdcall mySub(int inOption, int outXPR, VARIANT *outWeight_Coeff)
Private Declare Sub mySub Lib "[dll path here]" (ByVal inOption As Long, ByVal XPR As Long, ByRef outWeight_Coeff As Variant)

此方法允许您在C++ SaaFARRayReDIM中调整数组的大小,和/或创建一个新数组并替换在参数中传递的任何数组。 实现这一点的最简单方法是使用ATL类CComVariant和CComSafeArray。不要忘记对CComVariant使用Attach/Detach,否则可能会泄漏内存


不幸的是,如果你没有C++中COM自动化的经验,你将花费一些时间来实现即使是ATL实用程序类:At/OutLead、VtYByRef、不同的下限等,对于2D数组来说相对麻烦。

从第一次看,XPR应该长在VBA代码中,而不是整数。C++整数是VBA长。是的,对不起…复制粘贴的愚蠢得到了美沙克,这基本上解决了它。相反,我在函数中转换了Sub,在那里创建了我需要的数组作为SAFEARRAY,然后将其作为VARIANT传递给VBA。好主意:返回VARIANT比处理这些byref参数更简单。