2016-03-30 10 views
1

David Heffernanからこの素晴らしいコードが出ましたが、Lazarusでコンパイルできません。Lazarus/freepascalでバッファリングされたファイルストリームユニットをコンパイルする際のエラー

Buffered files (for faster disk access)

Iは、2つの異なるエラーメッセージを取得:

ライン72及び104:重複識別子CacheSizeの - >私はそれを改名し、:CacheSizeの:= aCacheSize

ライン53及び78を:インターフェイスメソッドQueryInterfaceの一致する実装がありません。

これを修正する方法はありません。私は、元の関数を呼び出すだけで新しいインターフェイス関数を作成しようとしましたが、機能しません。

助けてください!

答えて

1

最初のコマンドライン、またはラザロ特性に関連ティックに、インタフェースライン後({$モードデルファイ} -Sdをデルファイモードを有効にすることによって固定することができる。

第二の変更を必要とします。「CONST 「QueryInterfaceをして実装し、インターフェイスに

{$ifdef fpc} 
function TBaseCachedFileStream.QueryInterface(constref IID: TGUID; out Obj): HResult; 
{$else} 
function TBaseCachedFileStream.QueryInterface(const IID: TGUID; out Obj): HResult; 
{$endif} 

の両方をconstrefように変更する必要があります。この変化は、通常、参照することによって意味、および他のCPUには、それはしないので、インテルのconstに作られ、内部リードをconstrefするすべてCONSTを強制されましたそれらのプロセッサのコードを遅くする。

+0

私は追加する必要がありました;宣言の後、今ではコンパイル "STDCALLを"! Marcoに感謝します。私はまだそれを使用していないが、今しようとします。 –

0

はインターフェイス部では、この1 を試してみてください:

protected 
    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; 
    function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; 
    function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; 

と実装で:

function TMyObject.QueryInterface(constref iid: tguid; out obj): longint; 
begin 
    if GetInterface(iid, obj) then 
    Result := 0 
    else 
    Result := -1; 
end; 

function TMyObject._AddRef: longint; 
begin 
    Result := InterLockedIncrement(FRefCount); 
end; 

function TMyObject._Release: longint; 
begin 
    Result := InterLockedDecrement(FRefCount); 
    if FRefCount = 0 then 
    Free; 
end; 
関連する問題