c++ - 在 64 位 Excel 中调用 C DLL 以在 VBA 中使用

标签 c++ vba dll

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

目前他们甚至没有加载。我可以在 C++ 中调用 DLL。

示例代码如下,在 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

以下全部编译运行。

MathFuncsDll.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();

MathFuncsDll.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;
}

任何帮助将不胜感激! 詹姆斯

最佳答案

您在 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。

关于c++ - 在 64 位 Excel 中调用 C DLL 以在 VBA 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8367902/

相关文章:

xml - 在 VBA 中解析 XML 响应数据

sql-server - 从 vba 调用 MS SQL Server 标量 UDF

c++ - 当有许多函数要导入时替代 `LoadPackagedLibrary`

c++ - 我是否需要在显式加载的共享库之间隐式链接以进行交互?

c++ - tokenizer 将字符串转换为 float

c++ - 将类放在单独的文件中时无法调用函数

c++ - 使用CMake构建Qt项目并从QMainWindow继承导致未引用的vtable错误

c++ - 如何从代码块中的 .cpp 文件创建 .exe?

c++ - 在exe中编译静态库

VBA Excel : Copying across sheets using alphanumeric range vs cells