2016-03-30 3 views
1

Ich stieß auf diesen netten Code von David Heffernan, aber ich kann es nicht in Lazarus kompilieren.Fehler beim Kompilieren der gepufferten Datei-Stream-Einheit in Lazarus/Freepascal

Buffered files (for faster disk access)

ich 2 verschiedene Fehlermeldungen:

Linie 72 und 104: Doppelte Kennung CacheSize- -> Ich kann es nur umbenannt und: CacheSize-: = aCacheSize

Linie 53 und 78 : Keine passende Implementierung für Interface-Methode QueryInterface ...

Ich habe keine Ahnung, wie das zu beheben. Ich habe versucht, eine neue Schnittstellenfunktion zu erstellen, die einfach die ursprüngliche Funktion aufruft, aber es funktioniert nicht.

Hilfe, bitte!

Antwort

1

Die erste kann durch Aktivierung der Delphi-Modus ({$ mode delphi} nach der Schnittstellenleitung, -Sd auf der Kommandozeile oder den entsprechenden Haken in Lazarus Eigenschaften festgelegt werden.

Die zweiten Bedürfnisse Modifikationen. Die „const "in Query-Interface muss geändert werden

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

sowohl bei der Implementierung und Schnittstelle constref. Diese Änderung wurde vorgenommen, weil auf Intel konst bedeutet in der Regel Bezug genommen wird, und auf anderen CPUs dies nicht der Fall und zwingt alle cONST intern führt zu constref zu langsameren Code auf diesen Prozessoren

+0

musste ich hinzufügen "stdcall," nach den Erklärungen, aber jetzt stellt es! Danke Marco. Ich habe es noch nicht benutzt, werde es aber jetzt versuchen. –

0

Versuchen Sie diese In Interface-Teil:

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}; 

Und bei der Umsetzung:

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; 
Verwandte Themen