fpc/tests/webtbs/uw19159.pp
florian 589d061c3d * when comparing overridden methods, ignore hidden parameters because overridden methods does not
need to repeat a calling convention specifier so if the calling convention specifier 
  influences the hidden parameters, the methods are not considered equal, resolves #19159

git-svn-id: trunk@17832 -
2011-06-26 12:34:59 +00:00

87 lines
2.3 KiB
ObjectPascal

Unit uw19159;
{$MODE DELPHI}
interface
type
IGMStringStorage = interface(IUnknown)
['{6C1E6792-ED8D-4c16-A49E-12CB62F61E7E}']
function ReadString(const ValueName: String; const DefaultValue: String = ''): String; stdcall;
procedure WriteString(const ValueName, Value: String); stdcall;
end;
TGMStorageBase = class(TObject, IGMStringStorage)
protected
FRefCount: LongInt;
public
function QueryInterface(constref IID: TGUID; out Intf): HResult; virtual; stdcall;
function _AddRef: LongInt; virtual; stdcall;
function _Release: LongInt; virtual; stdcall;
function ReadString(const ValueName: String; const DefaultValue: String { = '' }): String; virtual; stdcall; abstract;
procedure WriteString(const ValueName, Value: String); virtual; stdcall; abstract;
end;
TGMIniFileStorage = class(TGMStorageBase)
public
//
// Error: There is no method in an ancestor class to be overridden: "TGMIniFileStorage.ReadString(const AnsiString,const AnsiString):AnsiString;"
//
// function ReadString(const ValueName: String; const DefaultValue: String = ''): String; override;
//
// Repeating the stdcall directive and it gets compiled!
//
function ReadString(const ValueName: String; const DefaultValue: String = '' ): String; override;
//
// But why does this method work without repeating the stdcall directive?
//
procedure WriteString(const ValueName, Value: String); override;
end;
implementation
{ ------------------------ }
{ ---- TGMStorageBase ---- }
{ ------------------------ }
function TGMStorageBase.QueryInterface(constref IID: TGUID; out Intf): HResult;
begin
if GetInterface(IID, Intf) then Result := S_OK else Result := E_NOINTERFACE;
end;
function TGMStorageBase._AddRef: LongInt;
begin
Result := InterlockedIncrement(FRefCount);
end;
function TGMStorageBase._Release: LongInt;
begin
Result := InterlockedDecrement(FRefCount);
//if (Result = 0) and RefLifeTime then OnFinalRelease;
end;
{ --------------------------- }
{ ---- TGMIniFileStorage ---- }
{ --------------------------- }
function TGMIniFileStorage.ReadString(const ValueName: String; const DefaultValue: String = ''): String;
begin
Result := '';
end;
procedure TGMIniFileStorage.WriteString(const ValueName, Value: String);
begin
end;
end.