Visual Studio 2019 C++ dll Excel VBA 插件问题

Posted

技术标签:

【中文标题】Visual Studio 2019 C++ dll Excel VBA 插件问题【英文标题】:Visual Studio 2019 C++ dll Excel VBA addin Problems 【发布时间】: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,没有发现拼写错误或错误。如何排除故障以找到问题?谢谢。 链接器 > 输入 > 模块定义文件设置似乎没有达到预期效果。密切关注设置对话框顶部的两个组合框。他们有不选择当前的诀窍。您需要对所有配置和所有平台进行此更改。 【参考方案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

【讨论】:

以上是关于Visual Studio 2019 C++ dll Excel VBA 插件问题的主要内容,如果未能解决你的问题,请参考以下文章

C++ 项目在 Visual Studio 2019 中触发了断点

使用 C++ 在 Visual Studio 2019 中创建新的头文件?

如何使用 Visual Studio 2019 和 c++ 链接 OpenSSL 库?

如何在 Visual Studio 2019 中有条件地编译 c++ 源文件?

Visual Studio 2019 C++ dll Excel VBA 插件问题

visual studio 2019中C++安装opencv