【发布时间】:2016-04-05 05:14:45
【问题描述】:
我在 Windows 10(64 位)上安装了 Lazarus 1.6/FPC 3.0,64 位,并移植了包含 InterlockedCompareExchangePointer 函数的 Delphi 代码。
FPC 3.0 不包含InterlockedCompareExchangePointer 声明;相反,它会“重载”InterlockedCompareExchange,如systemh.inc 所示:
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
{$ifdef cpu64}
function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64';
function InterlockedCompareExchange(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64';
{$else cpu64}
function InterlockedCompareExchange(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
{$endif cpu64}
现在我正在尝试将InterlockedCompareExchange 与指针一起使用:
program Project1;
uses Windows;
function Test: Boolean;
var
P1, P2: Pointer;
begin
Result:= InterlockedCompareExchange(P1, P2, nil) <> nil
end;
begin
Test;
end.
它不会与消息一起编译
project1.lpr(10,50) 错误:arg no 的类型不兼容。 3:得到 “指针”,应为“LongInt”
显然“过载”不起作用。如何解决?
我在默认(64 位)目标上使用 64 位 FPC 3.0。
【问题讨论】:
-
尝试使用
jwawinbase单元中的InterlockedCompareExchangePointer函数。或从uses子句中删除windows单元或调用函数为System.InterlockedCompareExchange,因为它是跨平台的。 -
这些都应该是理想世界中的编译器内在函数
标签: delphi lazarus freepascal fpc