delphiXE5 64位DLL的Excel 2013 64位 – 奇怪的行为

我正在尝试在Delphi XE5中创build一个64位DLL,以便与Excel 2013的64位版本进行通信,但是没有任何成功。 把问题分解成最简单的forms,我写了这个简单的代码:

library test64; function xx(x : double) : double; stdcall; begin Result := x*2; end; exports xx; end. 

我知道stdcall; 不需要,但保持与32位兼容(它在32位完美工作)。 删除它不会改变一个事物,它只是被忽略。

并将其编译到Win64平台。 在Excel 2013 x64中声明了这个函数,如下所示:

 Declare PtrSafe Function xx Lib "my path here\Win64\Debug\dll\test64.dll" (ByVal x As Double) As Double 

现在如果单元格A2 = XX(A1),它总是给我零。 A1中的浮点值总是从DLL端读取为零(我也是在debugging模式下检查它的)。 但是,从DLL到Excel的输出工作,即如果它是:

 Result := 100; 

那么A2会读取100.我想我正在做一些非常错误的事情,但我不知道它是什么。 请帮忙吗? 提前致谢。

PS。 64位版本需要声明语句上的完整DLLpath。 32位不(即findDLL在工作表相同的path)。 奇怪的确…

注意:问题的原始版本包含了省略了ByVal不同代码。

默认parameter passing模式是ByRef 。 您没有指定ByValByRef ,因此使用默认值。 而ByRef是不正确的。 你的function不匹配ByRef

所以你需要明确指定ByVal

 Declare PtrSafe Function xx Lib "..." (ByVal x As Double) As Double 

我认为你在32位模式下摆脱了这种情况,因为Double比寄存器大,所以参数是通过地址传递的。 但在64位下,parameter passing到一个寄存器中。

另一个问题是,你不能直接从工作表中调用外部函数。 您需要将调用包装到VBA函数中的外部函数,并从工作表中调用该函数。

 Public Function Callxx(ByVal x As Variant) As Variant Callxx = xx(x) End Function