我从David Heffernan那里得到了这个很好的代码,但我无法在Lazarus中编译它。
Buffered files (for faster disk access)
我收到2条不同的错误消息:
第72和104行:重复标识符CacheSize - >我只是将其重命名为:CacheSize:= aCacheSize
第53和78行:接口方法QueryInterface ...
没有匹配的实现我不知道如何修补它。我试图创建新的界面功能只需调用原始函数,但它不起作用。
请帮助!
答案 0 :(得分:1)
第一个可以通过启用delphi模式({$ mode delphi}在界面行之后,命令行上的-Sd或Lazarus属性中的相关标记来修复。
第二个需要修改。 " const"在QueryInterface中必须更改为constref
{$ifdef fpc}
function TBaseCachedFileStream.QueryInterface(constref IID: TGUID; out Obj): HResult;
{$else}
function TBaseCachedFileStream.QueryInterface(const IID: TGUID; out Obj): HResult;
{$endif}
在实现和接口中。之所以进行此更改,是因为英特尔const通常意味着通过引用,而在其他CPU上它并没有,并且强制所有CONST内部constref导致这些处理器上的代码变慢。
答案 1 :(得分: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;