在Lazarus / freepascal中编译缓冲文件流单元的错误

时间:2016-03-30 08:03:17

标签: interface compiler-errors filestream pascal

我从David Heffernan那里得到了这个很好的代码,但我无法在Lazarus中编译它。

Buffered files (for faster disk access)

我收到2条不同的错误消息:

第72和104行:重复标识符CacheSize - >我只是将其重命名为:CacheSize:= aCacheSize

第53和78行:接口方法QueryInterface ...

没有匹配的实现

我不知道如何修补它。我试图创建新的界面功能只需调用原始函数,但它不起作用。

请帮助!

2 个答案:

答案 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;