2016-04-05 8 views
1

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を使用しています。

+0

を 'jwawinbase'ユニットから' InterlockedCompareExchangePointer'関数を使用してみてください。または、 'windows'ユニットを' uses'節から削除するか、または 'System.InterlockedCompareExchange'として関数をクロスプラットフォームなので呼び出すことができます。 – Abelisto

+0

これらはすべて理想的な世界のコンパイラ組み込み関数でなければなりません –

答えて

2

次の回避策

{$ifdef fpc} 
function InterlockedCompareExchangePointer(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; 
begin 
{$ifdef cpu64} 
    Result:= Pointer(InterlockedCompareExchange64(int64(Target), int64(NewValue), int64(Comperand))); 
{$else cpu64} 
    Result:= Pointer(InterlockedCompareExchange(LongInt(Target), LongInt(NewValue), LongInt(Comperand))); 
{$endif cpu64} 
end; 
{$endif fpc} 

コンパイルとDelphi/FPC互換性を保証します。 InterlockedCompareExchangePointer宣言の不在のように見えるのは修正すべきFPCバグです。

+0

私が追加したもの:http://bugs.freepascal.org/view.php?id=29965 – HNB

関連する問題