gpt4 book ai didi

通过 Excel/VBA 调用的 DLL 中的 C++ 函数在传递双参数时生成异常

转载 作者:行者123 更新时间:2023-12-04 19:48:54 26 4
gpt4 key购买 nike

我正在尝试通过 DLL 在 Excel/VBA 中使用 C/C++ 静态函数。

我在 VS17 中调试时遇到异常,我怀疑这是参数传递方式的问题(它是 double 的)

Exception thrown at 0x00007FFA28BBA14F (kernel32.dll) in EXCEL.EXE:0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

这是我的 C 代码:

测试.h

extern "C" __declspec(dllexport) double get_sum_cpp(double x);

测试.cpp

double WINAPI get_sum_cpp(double x)
{
double res = x + x;
return res;
}

VBA 中的声明:

Declare PtrSafe Function get_sum_cpp Lib "C:\Users\bbi\source\repos\Test\x64\Debug\Test.dll" (ByVal my_var As Double) As Double

VBA 中的测试代码:

Sub testSum()

Dim A As Double
Dim Asum As Double

A = 5

Asum = get_sum_cpp(A)

end sub

我运行的是 64 位 excel,dll 是在 64 位 Debug模式下编译的。

我在整体开发方面还有很多问题(例如,任何具有多个参数的函数都会使 excel 完全崩溃),但这也是我能得到的最小“单元测试”。

我觉得 VBA 双参数传递给 DLL 函数的方式有问题(堆栈未对齐?),但我不知道如何正确设置它。在 VS17 中调试时,异常发生在我到达“double res = x + x”行之前,所以我怀疑它发生在函数声明处,所以当传递 double 参数时——所以是一个转换问题——又可能是堆栈未对齐?

我的导出似乎没问题 - 使用 dumpbin/EXPORTS 检查。找到函数并最终返​​回。

有什么想法吗?

最佳答案

我已经在我的电脑上成功运行了你的代码,没有任何问题。

我的 VBA 脚本:

Private Declare PtrSafe Function get_sum_cpp Lib "D:\Codes\VC\TestVBA\x64\Debug\Dll2.dll" (ByVal my_var As Double) As Double

Sub testSum()

Dim A As Double
Dim Asum As Double

A = 5

Asum = get_sum_cpp(A)

MsgBox "Val is: " & Asum
End Sub

和您的 C++ 代码。我已经用你的代码和使用 __declspec(dllexport) 和定义文件进行了测试。两者都有效。我还测试了使用/不使用 DLL 运行时库。仍然有效。

我使用过 VS2019、Excel 2019。如果它们不是同一版本,请确保您使用的是 /MT 而不是 /MTd 用于非 DLL 运行时虽然是图书馆。

关于通过 Excel/VBA 调用的 DLL 中的 C++ 函数在传递双参数时生成异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71295342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com