Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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
C++ 在64位Excel中调用用于VBA的C DLL_C++_Vba_Dll - Fatal编程技术网

C++ 在64位Excel中调用用于VBA的C DLL

C++ 在64位Excel中调用用于VBA的C DLL,c++,vba,dll,C++,Vba,Dll,我需要调用64位Excel中的DLL,以便在VBA中使用。 i、 )有人告诉我不能在64位程序中使用32位dll,这是真的吗? ii.)是否有人知道他们知道正在演示将dll加载到VBA中的示例 目前他们甚至还没有装货。我可以从C++内部调用DLL的罚款。< /P> 示例代码如下所示,在64位模式下编译良好。我已尝试注册该函数。VBA错误为“编译错误:预期库” VBA中调用函数失败 Public Declare PtrSafe Function getNumber_Lib "C:\Users\ja

我需要调用64位Excel中的DLL,以便在VBA中使用。 i、 )有人告诉我不能在64位程序中使用32位dll,这是真的吗? ii.)是否有人知道他们知道正在演示将dll加载到VBA中的示例

目前他们甚至还没有装货。我可以从C++内部调用DLL的罚款。< /P> 示例代码如下所示,在64位模式下编译良好。我已尝试注册该函数。VBA错误为“编译错误:预期库”

VBA中调用函数失败

Public Declare PtrSafe Function getNumber_Lib "C:\Users\james.allsop\Documents\Visual Studio 2010\Projects\DynamicLibrary\x64\Debug\MathFuncsDll.dll" () As Integer
以下是所有编译和运行

MathFuncsdl.h

// MathFuncsDll.h
// Returns a + b
__declspec(dllexport) double Add(double a, double b);
// Returns a - b
__declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
__declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
__declspec(dllexport) double Divide(double a, double b);
__declspec(dllexport) double getNumber();
mathfuncsdl.cpp

#include "MathFuncsDll.h"
double Add(double a, double b)
{
  return a + b;
}

double Subtract(double a, double b)
{
  return a - b;
}

double Multiply(double a, double b)
{
  return a * b;
}

double Divide(double a, double b)
{
  if (b == 0)
  {
    return -1.0;
  }
  return a / b;
}

double getNumber()
{
    return 1000;
}
MyExecRefsDll.cpp

// MyExecRefsDll.cpp : Defines the entry point for the console application.
//
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib

#include <iostream>
// Returns a + b
__declspec(dllimport) double Add(double a, double b);

// Returns a - b
__declspec(dllimport) double Subtract(double a, double b);

// Returns a * b
__declspec(dllimport) double Multiply(double a, double b);

// Returns a / b
// Throws DivideByZeroException if b is 0
__declspec(dllimport) double Divide(double a, double b);
__declspec(dllimport) double getNumber();

int main()
{
    double a = 7.4;
    int b = 99;
    std::cout << "a + b = " << Add(a, b) << "\n";
    std::cout << "a - b = " << Subtract(a, b) << "\n";
    std::cout << "a * b = " << Multiply(a, b) << "\n";
    std::cout << "a / b = " << Divide(a, b) << "\n";
    return 0;
}
//MyExecRefsDll.cpp:定义控制台应用程序的入口点。
//
//MyExecRefsDll.cpp
//使用:/EHsc/link mathfuncsdl.lib编译
#包括
//返回a+b
__declspec(dllimport)双加(double a,double b);
//返回a-b
__declspec(dllimport)双减法(双a,双b);
//返回a*b
__declspec(dllimport)双倍乘法(双a,双b);
//返回a/b
//如果b为0,则引发DivideByZeroException
__declspec(dllimport)双除法(双a,双b);
__declspec(dllimport)double getNumber();
int main()
{
双a=7.4;
int b=99;

std::cout您在VBA中的声明包含错误。它应该是:

Public Declare PtrSafe Function getNumber Lib "C:\Users\james.allsop\Documents\Visual Studio 2010\Projects\DynamicLibrary\x64\Debug\MathFuncsDll.dll" () As Integer
而不是:

Public Declare PtrSafe Function getNumber_Lib "C:\Users\james.allsop\Documents\Visual Studio 2010\Projects\DynamicLibrary\x64\Debug\MathFuncsDll.dll" () As Integer
请注意删除的下划线


是的,您不能从64位应用程序调用32位DLL,反之亦然。这是所有应用程序的一般限制,不仅仅是VBA或Excel。

谢谢,因为编辑器中有下划线,所以没有看到它。谢谢,感谢您在32/64位部分对我进行了直接设置。还发现您需要一个def文件。导出是不够的。