Windows 10(64ビット)に64ビットのLazarus 1.6/FPC 3.0をインストールし、InterlockedCompareExchangePointer
を含むDelphiコードを移植しました。FPC 3.0とInterlockedCompareExchange
FPC 3.0にはInterlockedCompareExchangePointer
の宣言は含まれていません。代わりに、それはsystemh.inc
に見られるように、「オーバーロード」InterlockedCompareExchange
:
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) Error: Incompatible type for arg no. 3: Got "Pointer", expected "LongInt"
明らかに「オーバーロード」は機能しません。それを修正するには?
私はデフォルト(64ビット)ターゲットで64ビットFPC 3.0を使用しています。
を 'jwawinbase'ユニットから' InterlockedCompareExchangePointer'関数を使用してみてください。または、 'windows'ユニットを' uses'節から削除するか、または 'System.InterlockedCompareExchange'として関数をクロスプラットフォームなので呼び出すことができます。 – Abelisto
これらはすべて理想的な世界のコンパイラ組み込み関数でなければなりません –