我在以下场景中收到“灾难性故障”错误。
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;
Run Code Online (Sandbox Code Playgroud)
myDouble := GetDoubleValue(ID);调用此函数时,我在“”行上收到错误。
几乎可以肯定,此错误是由于调用约定或参数列表不匹配造成的。
您从 DLL 导入的函数实际上不太可能是safecall. 该调用约定与 COM 方法一起使用来执行HRESULT参数列表重写。更合理的是调用约定是stdcall,但您必须检查。您还应该仔细检查参数和返回类型是否完全匹配。
如果您自己无法解决这个问题,请在问题中添加 DLL 源代码(或文档)中的函数声明。
我也不喜欢使用@函数指针。它往往会导致编译器可能发现的错误。我会这样写你的代码:
LibHandle := LoadLibrary('GetDoubleValue.dll');
Win32Check(LibHandle<>0);
GetDoubleValue := GetProcAddress(LibHandle, 'getDoubleValue');
Win32Check(Assigned(GetDoubleValue));
myDouble := GetDoubleValue(ID);
Run Code Online (Sandbox Code Playgroud)
FWIW,我是它的超级粉丝Win32Check,因为它消除了高级代码中的分支,这使得它更容易阅读。
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |