2016-03-30 24 views
1

我從David Heffernan遇到了這個很好的代碼,但是我無法在Lazarus中編譯它。在Lazarus/freepascal中編譯緩衝的文件流單元的錯誤

Buffered files (for faster disk access)

我得到2個不同的錯誤消息:

線72和104:重複標識符的CacheSize - >我剛更名並:CacheSize的:= aCacheSize

線53和78 :沒有匹配的實現接口方法QueryInterface ...

我不知道如何修補。我試圖創建新的接口函數,只是調用原始函數,但它不起作用。

請幫忙!

回答

1

第一可通過命令行,或者在拉扎勒斯屬性相關蜱啓用的Delphi模式({$模式的Delphi}接口線路後,-Sd被固定。

第二需求修改。「常量「中的QueryInterface必須改爲constref

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

無論是在實現和接口。這一變化是英特爾常量,因爲製作通常是通過引用意味着,和其他CPU它不併迫使所有常在內部constref線索到那些處理器上的較慢代碼。

+0

我不得不添加 「STDCALL;」 的聲明後,但現在它編譯!感謝Marco。我還沒有使用它,但現在會嘗試。 –

0

試試這個 在接口部分:

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;