gpt4 book ai didi

c++ - 如何从 C++ DLL 返回的指针获取 VBA 中的整个矩阵?

转载 作者:行者123 更新时间:2023-11-30 03:32:15 25 4
gpt4 key购买 nike

我用 C++ 为 DLL 编写了一段代码,该 DLL 从 VBA 获取一个数组作为输入,并创建一个新数组,然后将其返回给 VBA。

DLL.h的写法如下:

// FieldTrans.h
#ifdef FIELDTRANS_EXPORTS
#define FIELDTRANS_API __declspec(dllexport)
#else
#define FIELDTRANS_API __declspec(dllimport)
#endif

extern "C"
{
// Returns the normalized cardinal sinus coefficient
FIELDTRANS_API double _stdcall SinC(double x);
// Returns the interpolated field matrix: 180° x 360° with Res step
FIELDTRANS_API double _stdcall ShannonInterp(double** Matrix[], int MatrixHeight, int MatrixWidth, double Res, double DeltaTheta, double DeltaPhi);
};

和 .cpp 文件:

// FieldTrans.cpp
#include "stdafx.h"
#include "FieldTrans.h"
#include <math.h>
#include <vector>

double _stdcall SinC(double x)
{
double y;
y = 1;
if (x != 0)
{
y = sin(3.14159265358979323846 * x) / (3.14159265358979323846 * x);
}
return y;
}

double** _stdcall ShannonInterp(double** Matrix, int MatrixHeight, int MatrixWidth, double Res, double DeltaTheta, double DeltaPhi)
{
int k, l, m, n;
double iRes, jRes;
double ThetaSinC, PhiSinC;
int Height = static_cast<int> (180 / Res);
int Width = static_cast<int> (360 / Res);
double** Interpolated = new double*[Height];
k = 0;
m = 1;

for (int i = 0; i < Height; i++)
{
Interpolated[i] = new double[Width];
iRes = i * Res;
do
{
k = k + 1;
m = k + 1;
} while (iRes >(k + 1) * DeltaTheta);
if (m > MatrixHeight)
{
m = MatrixHeight - 1;
}
ThetaSinC = SinC((iRes - k * DeltaTheta) / DeltaTheta);
l = 0;
n = 1;
for (int j = 0; j < Width; j++)
{
jRes = j * Res;
do
{
l = l + 1;
n = l + 1;
} while (jRes >(l + 1) * DeltaPhi);
if (n > MatrixWidth)
{
n = 0;
}
PhiSinC = SinC((jRes - l * DeltaPhi) / DeltaPhi);
Interpolated[i][j] = 1 * ThetaSinC * PhiSinC + 2 * ThetaSinC * (1 - PhiSinC) + 3 * (1 - ThetaSinC) * PhiSinC + 4 * (1 - ThetaSinC) * (1 - PhiSinC);
}
}
return Interpolated;
}

在 .def 文件中定义调用名称后,我在我的 VBA 代码中编写了以下声明来调用其中一个函数:

Private Declare Function ShannonInterp Lib "C:\NSI2000\Script\FieldTrans.dll" (ByRef Matrix() As Double, ByVal MatrixHeight As Integer, ByVal MatrixWidth As Integer, ByVal Res As Double, ByVal DeltaTheta As Double, ByVal DeltaPhi As Double) As Double

而且我可以像这样使用函数而不会出现任何崩溃或错误:

PointerCo = ShannonInterp(AmplCo, PointsTheta, PointsPhi, Resolution, 181 / (PointsTheta+1), 361 / (PointsPhi+1))

我的问题是:我猜 PointerCo 是一个指针,但我需要将它引用的整个矩阵存储在一个变量中。是否可以?我该怎么做?

最佳答案

不,你不能像那样在 VBA 和 C++ 之间“互操作”。

到目前为止,最简单的方法是在 C++ 端使用 VT_VARIANT 的 SAFEARRAY 类型,它映射到 VBA 中的经典 Variant 数组类型。互联网上散布着很多这方面的教程。

如果您以前没有使用过 Microsoft COM 及其相关的支持类,我建议您留出一个月的时间来快速上手。

关于c++ - 如何从 C++ DLL 返回的指针获取 VBA 中的整个矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43604463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com