从C++ DLL返回动态分配的数组到VBA
免责声明:我知道如何在VBA中分配内存,在C++ DLL中填充数组并返回指针,但很遗憾的是,我可能发现一些情况下,我无法知道数组的大小,因此在将其传递给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 =
假设我的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参数更简单。