【发布时间】:2016-03-08 00:27:13
【问题描述】:
您好,我正在尝试创建一个用于 Excel 的简单 C++ dll。
这是我所做的:
.cpp 文件:
double _stdcall Test(double z)
{
return z+2.0;
}
.def 文件:
LIBRARY
EXPORTS
Test
在视觉工作室中: 项目属性>配置属性>命令>“路径/EXCEL.EXE”
配置管理器 > 平台 > x64
在 VBA 中:
Declare PtrSafe Function Test Lib _
"Path\MyDLL" (ByVal z As Double) As Double
但是当我在 Excel 中调用 Test(2) 时,它返回 2,而不是 4。似乎参数总是被视为 0(实际上,如果我在调用函数时在文件中输出 z 的值,它是2.122e-314)。
任何意见将不胜感激。
谢谢
编辑 1: 如果我将参数和返回值更改为 int 并在 VBA 中更改为 Long,Test(2) 将返回 3。
有人知道为什么 int 的参数是 1 吗?
【问题讨论】:
-
一切都适合我。您是否记得将模块定义文件设置为您的 .def 文件?这是什么
Project Properties > Configuration properties > Command > "Path/EXCEL.EXE"。我没有这样的选择。 -
如果我不放这个,我会收到以下错误:“path/MyDLL.dll”不是有效的 Win32 应用程序。问题是 def 文件可能工作正常,因为函数被调用,只是 Excel 参数没有被考虑
-
您的 C++ 编译器不知道函数正在导出。所以它期望参数以不同的方式传递,浮点是用 SSE 指令完成的,参数是通过 XMM0 寄存器传递的。然而,Excel 假定参数应该以传统方式在 FPU 寄存器 ST0 中传递。将
__declspec(dllexport)放在函数前面即可解决问题。 -
您好,感谢您的意见,但没有解决问题。