我在使一个简单的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':无法在c:\ VS19Projects \ CPP \ SimpleMath \ Debug \ SimpleMath.dll中完善DLL入口点SimpleMath”。
我已使用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可访问的MSVC Dll。我在Visual Studio中执行此操作时遇到了问题(尚未建立MSBuild学习曲线)。因此,按照下面代码中的注释,我使用VS代码通过smdll.cpp和smapp.cpp的命令行编译进行了此操作。我在下面包括了C ++测试代码(smapp.cpp)和VBA代码。可以为C ++测试代码添加调试编译开关[/ LDd(smdll.cpp)和/ Zi(smapp.cpp)]。我使用VS2019“开发人员命令提示符”执行:“ ...> dumpbin / EXPORTS smdll.dll”来确定VBA别名(_SimpleMath @ 4)。
有关如何在VS2019中使用VS2019 MSBuild进行“ get_up_the_curve”的指南,将不胜感激?我能够在VS Code中使用Build和Debug脚本。我无法使* .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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句