Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的VBA在C++;动态链接库? 我需要在C++中编写一个DLL,包含了一些我以后在VBA中使用的函数。 我写的.h文件看起来是这样的(尽管我承认我从因特网上的一些例子中抄袭了,因为我是非常/强>新到C++,我不确定我是否需要所有这些东西):< /P>_C++_Vba_Dll_Dllimport - Fatal编程技术网

为什么我的VBA在C++;动态链接库? 我需要在C++中编写一个DLL,包含了一些我以后在VBA中使用的函数。 我写的.h文件看起来是这样的(尽管我承认我从因特网上的一些例子中抄袭了,因为我是非常/强>新到C++,我不确定我是否需要所有这些东西):< /P>

为什么我的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

虽然.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 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))