2016-04-05 3 views
1

Я установил Lazarus 1.6/FPC 3.0, 64 бит на Windows 10 (64 бит) и портировал код Delphi, содержащий функцию InterlockedCompareExchangePointer.FPC 3.0 и InterlockedCompareExchange

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) Error: Incompatible type for arg no. 3: Got "Pointer", expected "LongInt"

поэтому, очевидно, «перегрузка» не работает. Как это исправить?

Я использую 64-разрядный FPC 3.0 по умолчанию (64-разрядная) цель.

+0

Попытка использовать функцию '' InterlockedCompareExchangePointer' из jwawinbase' блока. Или удалите блок '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

Смежные вопросы