【问题标题】:Catastrophic Failure in Delphi XE4 while calling DLL functionDelphi XE4 在调用 DLL 函数时发生灾难性故障
【发布时间】:2014-01-27 10:31:06
【问题描述】:

我在以下情况下收到“灾难性故障”错误。

type
TGetDoubleValue = function (var ID: Integer): Double; safecall;
....
....
var
GetDoubleValue: TGetDoubleValue;
.....
.....
LibHandle := LoadLibrary('GetDoubleValue.dll');
@GetDoubleValue := GetProcAddress(LibHandle, 'getDoubleValue');
if not (@GetDoubleValue = nil) then
begin
  myDouble := GetDoubleValue(ID);
end
else
  RaiseLastOSError;

调用此函数时,“myDouble := GetDoubleValue(ID);”行出现错误。

【问题讨论】:

  • 我相信你会承认,这与你原来的这个问题的版本有些不同。您的原件完全无法回答。我想建议,在第一次问一个好问题时,别人会花更多的时间帮助你付出更多的努力。
  • @CraigYoung - 感谢您的建议。我会记住这一点。

标签: delphi delphi-xe4


【解决方案1】:

几乎可以肯定,此错误是由于调用约定或参数列表不匹配造成的。

您从 DLL 导入的函数不太可能真的是 safecall。该调用约定与 COM 方法一起使用以执行 HRESULT 参数列表重写。更合理的是调用约定是stdcall,但您必须检查。您还应该仔细检查参数和返回类型是否完全匹配。

如果您无法自己解决,请在问题中添加 DLL 源代码(或文档)中的函数声明。

我也不喜欢将@ 与函数指针一起使用。它往往会导致编译器可能发现的错误。我会这样写你的代码:

LibHandle := LoadLibrary('GetDoubleValue.dll');
Win32Check(LibHandle<>0);
GetDoubleValue := GetProcAddress(LibHandle, 'getDoubleValue');
Win32Check(Assigned(GetDoubleValue));
myDouble := GetDoubleValue(ID);

FWIW,我是 Win32Check 的忠实粉丝,因为它从高级代码中删除了分支,使其更易于阅读。

【讨论】:

  • 如果我是你,我会想要的不仅仅是反复试验。你手边有其他函数的声明吗?
  • 我有 3 个用 safecall 声明的函数,都导致了同样的问题。
  • 你能从DLL的源代码中显示getDoubleValue的声明吗?
  • 我无法打开这个 dll。这是与 Firebird 一起安装在路径 C:\Program Files (x86)\Firebird\Firebird_2_5\UDF 的 UDFPricing.dll
  • @DavidHeffernan 你说得对,cdecl 会更有意义,但我早就放弃了对任何东西的期待!
猜你喜欢
  • 1970-01-01
  • 2010-12-04
  • 2012-04-06
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多