为什么我的VBA在C++;动态链接库? 我需要在C++中编写一个DLL,包含了一些我以后在VBA中使用的函数。 我写的.h文件看起来是这样的(尽管我承认我从因特网上的一些例子中抄袭了,因为我是非常/强>新到C++,我不确定我是否需要所有这些东西):< /P>
虽然.cpp文件包含这些函数的实际定义:为什么我的VBA在C++;动态链接库? 我需要在C++中编写一个DLL,包含了一些我以后在VBA中使用的函数。 我写的.h文件看起来是这样的(尽管我承认我从因特网上的一些例子中抄袭了,因为我是非常/强>新到C++,我不确定我是否需要所有这些东西):< /P>,c++,vba,dll,dllimport,C++,Vba,Dll,Dllimport,虽然.cpp文件包含这些函数的实际定义: // FieldTrans.cpp #include "stdafx.h" #include "FieldTrans.h" #include <array> // for counting elements of an array #define _USE_MATH_DEFINES // for M_PI #include <math.h> // for M_PI and Log1
// FieldTrans.cpp
#include "stdafx.h"
#include "FieldTrans.h"
#include <array> // for counting elements of an array
#define _USE_MATH_DEFINES // for M_PI
#include <math.h> // for M_PI and Log10
using namespace std;
double SinC(double x)
{
if (x == 0)
{
return 1;
}
else
{
return sin(M_PI * x) / (M_PI * x);
}
}
double ShannonInterp(double *Matrix[], double Res, double DeltaTheta, double DeltaPhi)
{
int k, l, m, n;
double iRes, jRes;
double ThetaSinC, PhiSinC;
int MatrixHeigth = sizeof(Matrix) / sizeof(Matrix[0]), MatrixWidth = sizeof(Matrix[0]) / sizeof(Matrix);
int Height = 180 / Res, Width = 360 / Res;
double *Interpolated = new double[Height * Width];
k = 0;
m = 1;
for (int i = 0; i < Height; i++)
{
iRes = i * Res;
do
{
k = k + 1;
m = k + 1;
} while (iRes > (k + 1) * DeltaTheta);
if (m > MatrixHeigth)
{
m = MatrixHeigth - 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 * Width + j] = Matrix[k][l] * ThetaSinC * PhiSinC + Matrix[k][n] * ThetaSinC * (1 - PhiSinC) + Matrix[m][l] * (1 - ThetaSinC) * PhiSinC + Matrix[m][n] * (1 - ThetaSinC) * (1 - PhiSinC);
}
}
return *Interpolated;
}
但是它不起作用,因为当我使用这个函数时,它说在模块中找不到它。我使用的函数如下所示:
InterpCo = Shannonize(AmplCo, Resolution, 181 / (PointsTheta+1), 361 / (PointsPhi+1))
提供的AmplCo
是一个二维双精度数组,其他输入是整数
你能帮我弄明白怎么了吗
< >编辑:如果我试图从我的VBA程序中插入.dll的引用,它会说“坏引用”。 看起来,从DLL导出的C++函数的名称已经被修改。与C不同,C++函数可以重载(同名但不同的参数),可以驻留在命名空间中,因此导出函数的名称也将包含一些额外后缀。您可以使用
extern“C”{/*您的代码*/}
块包围导出的函数,以防止名称损坏,或者使用正确的命名编写模块导出文件(.def)。使用dumpbin或Dependency Walker检查DLL的导出。错误很多。C++编译器修饰函数的名称以支持重载,你必须用<代码>外部“C”< /代码>关闭它。调用约定错误,您必须使用\uu stdcall
。VBA希望将数组封送为SAFEARRAY
。您不能添加引用,这不是COM服务器,只有Declare。迈出一小步,不要试图一口吞下所有这些,否则你将不可避免地陷入困境。有大量的网页展示了如何做到这一点。我已经阅读了2天各种各样的东西,是的,虽然我同意我不应该一次吞下所有的东西,但我仍然被期望这样做。也许我很笨,但我在这里找不到类似的例子。即使是extern
也不能按预期的方式工作,如果我在头文件和che cpp文件中使用它,正如@VTT指出的那样,这需要时间。听从汉斯的建议。否则你将永远不会成功。在标题中还是在cpp中?你能写一个例子吗?在header和cpp中都写。如果我在header中写,它似乎可以工作,但是如果我在cpp中写,它不会工作,对不对,.cpp文件确实包含声明已标记为extern的header,所以不需要用extern在.cpp中包装定义。
Private Declare Function Shannonize Lib "C:\Users\daquino\Documents\Visual Studio 2013\Projects\FieldTrans\Release\FieldTrans.dll" Alias _
"ShannonInterp" (ByRef Matrix() As Double, ByVal Res As Double, ByVal DeltaTheta As Double, ByVal DeltaPhi As Double) As Double
InterpCo = Shannonize(AmplCo, Resolution, 181 / (PointsTheta+1), 361 / (PointsPhi+1))