【问题标题】:Visual Studio 2019 C++ dll Excel VBA addin ProblemsVisual Studio 2019 C++ dll Excel VBA 插件问题
【发布时间】:2020-02-28 21:41:37
【问题描述】:

我在让简单的 Excel VBA 插件正常工作时遇到问题。我正在使用https://www.vitoshacademy.com/c-adding-c-function-to-vbaexcel/ 的简单示例开始使用,但连这个简单示例都无法正常工作。 SimpleMath.cpp、defMe.def 和 VBA 代码如下。我已添加到 SimpleMath.cpp 属性:链接器:输入:模块定义文件:defMe.def。在 VS2019 中,C++ 代码成功编译并按预期在 Debug 文件夹中生成 SimpleMath.dll。但是我尝试了很多替代方法,但无法让 Excel 中的 VBA 代码正常工作。由于该示例的许多 Web 变体看起来很旧,我想知道 VS2019/C++ 是否需要旧示例中未涵盖的内容?

在 Excel 中我得到“运行时错误 '453': Can't Fine DLL entry point SimpleMath in c:\VS19Projects\CPP\SimpleMath\Debug\SimpleMath.dll”。

我使用了 dumpbin /HEADERS SimpleMath.dll 来尝试查看 dll 入口点。不返回入口点。这似乎表明我对 *.def 的使用不正确。

我们将不胜感激。

//SimpleMath.cpp
int __stdcall SimpleMath(int & x)
{
    int result = 0;
    for (int a = 0; a <= x; a++) {
        result += a;
    }
    return result;
}
;defMe.def C++ code
LIBRARY "SimpleMath"
EXPORTS
SimpleMath
// VBA Code in Excel Module
Declare Function SimpleMath Lib "C:\VS2019Projects\SimpleMath\Debug\SimpleMath.dll" (ByRef x As        Long) As Long
Sub TestMe()
    Dim n As Long: n = 5
    dim result as long
    result = SimpleMath(n)
End Sub

【问题讨论】:

  • 您说,“Excel 中的 VBA 代码可以工作。由于该示例的许多 Web 变体看起来很旧,我想知道 VS2019/C++ 是否需要旧示例中未涵盖的内容?”。您能否准确报告您看到的错误?
  • 我得到运行时错误 '453': Can't Fine DLL entry point SimpleMath in c:\VS19Projects\CPP\SimpleMath\Debug\SimpleMath.dll。我仔细查看了 C++ 代码和 VBA,没有发现拼写错误或错误。如何排除故障以找到问题?谢谢。
  • 链接器 > 输入 > 模块定义文件设置似乎没有达到预期效果。密切关注设置对话框顶部的两个组合框。他们有不选择当前的诀窍。您需要对所有配置和所有平台进行此更改。

标签: c++ excel visual-studio dll


【解决方案1】:

我的 DLL 仍然无法与 Excel 一起使用。我进行了深思熟虑的研究,以学习和调试并使用 Excel。

我尝试过使用 C++ *.def 和 VBA Declare 的 EXPORTS 变体。没有成功。

然后我发现了 MSFT Mixed Mode Debugging Tutorial。我能够让这个 C++ DLL/C# 示例应用程序在 VS2019 中快速运行。我无法使其适应 Excel VBA。当然可能是我对“原生和托管 C++ 代码”的理解不够。

我的项目目标是最终(并且希望)成功地创建一个高性能 C++ DLL 来加速 Excel 中的大型二维数组计算。我有一个性能较低的 C# COM dll 工作,但需要更高性能的 C++ DLL。但我什至无法让这个更简单的 C++ DLL 工作。

我们将不胜感激实现这些目标的指导和建议。

【讨论】:

    【解决方案2】:

    我终于得到了这个示例 Excel VBA 可访问的 MSVC Dll 使用下面的代码。我在 Visual Studio 中执行此操作时遇到了问题(尚未达到 MSBuild 学习曲线)。因此,我使用 VS 代码和命令行编译 smdll.cpp 和 smapp.cpp 按照下面代码中的 cmets 执行此操作。我在下面包含了 C++ 测试代码 (smapp.cpp) 和 VBA 代码。可以为 C++ 测试代码添加调试编译开关 [/LDd (smdll.cpp) & /Zi (smapp.cpp)]。我使用VS2019“开发者命令提示符”执行:“...>dumpbin /EXPORTS smdll.dll”来确定VBA别名(_SimpleMath@4)。

    有关如何使用 VS2019 MSBuild “get_up_the_curve”在 VS2019 中开发的指南将不胜感激?我能够让构建和调试脚本在 VS Code 中工作。我无法让 *.def 文件方法工作。对此的指导也将不胜感激。

     //smdll.cpp
     // cl /EHsc /LD smdll.cpp
     #include "smdll.h"
     extern "C" {__declspec(dllexport)  long __stdcall SimpleMath(long  x)
        {   long result = 0;
            for (long a = 0; a <= x; a++) result += a;
            return result;
        }
      }
    // smdll.h
    extern "C" {__declspec(dllexport)  long __stdcall SimpleMath(long  x);}
    // smapp.cpp
    // cl /EHsc smapp.cpp smdll.lib
    #include <iostream>
    #include "smdll.h"
    using namespace std;
    void main () {
        const long x = 5;
        long result = SimpleMath(x);
        cout << "Ans: " << result << endl;
    }
    'Excel VBA subroutine
    Option Explicit
    'used "...>dumpbin /EXPORTS smdll.dll VS 2019 command to get below Alias for smapp
    Declare Function smapp Lib "<Path_to>\SimpleMath\smdll.dll" Alias "_SimpleMath@4" (ByVal a As Long) As Long
    Sub test()
    Dim x, result As Long
    x = 5
    result = smapp(x)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多