2016-03-30 15 views
1

'daki arabellek dosya akışı birimini derlemekle ilgili hatalar David Heffernan'ın bu güzel koduna rastladım, ancak bunu Lazarus'ta derleyemiyorum. CacheSize: = aCacheSizeLazarus/freepascal

hat 53 ve 78 -:

hat 72 ve 104:> Ben sadece adını ve yinelenen tanımlayıcı CacheSize

Buffered files (for faster disk access)

Ben 2 farklı hata iletileri almak : Arabirim yöntemi için eşleşen uygulama yok QueryInterface ...

Bunu nasıl düzelteceğimi bilmiyorum. Sadece orijinal işlevi çağırmak için yeni arayüz fonksiyonunu yaratmaya çalıştım ama işe yaramıyor.

Yardım, lütfen!

birinci komut veya Lazarus özelliklerinde ilgili kene, arayüz hattı sonra SD Delphi modu ({$ modu Delphi} etkinleştirerek sabitlenebilir

cevap

1

.

ikinci ihtiyaçları modifikasyonları. "Sabit "QueryInterface uygulama ve arayüzde

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

hem constref şekilde değiştirilmelidir. Bu değişiklik, Intel yapı üzerinde çünkü yapıldı genellikle referans olarak ima ve diğer CPU üzerinde değil ve içten yol constref tüm SABİT'i zorlayarak yapar Bu işlemcilerde daha yavaş kodlar için

+0

eklemek için "stdcall;" beyanlarına sonra, ancak şimdi derler! teşekkürler Marco. Henüz kullanmadım ama şimdi deneyeceğim. –

0

arayüzü bölümünde bu bir deneyin:

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

Ve uygulanmasında: Ben

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;