mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 17:59:27 +02:00
* added testcase for right behavior of AS and SUPPORTS so that QueryInterface is called before GetInterface
git-svn-id: trunk@15067 -
This commit is contained in:
parent
8391b717ea
commit
f0ce69b264
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -8315,6 +8315,7 @@ tests/tbs/tb0567.pp svneol=native#text/plain
|
||||
tests/tbs/tb0568.pp svneol=native#text/plain
|
||||
tests/tbs/tb0569.pp svneol=native#text/pascal
|
||||
tests/tbs/tb0570.pp svneol=native#text/plain
|
||||
tests/tbs/tb0571.pas svneol=native#text/plain
|
||||
tests/tbs/tb205.pp svneol=native#text/plain
|
||||
tests/tbs/ub0060.pp svneol=native#text/plain
|
||||
tests/tbs/ub0069.pp svneol=native#text/plain
|
||||
|
73
tests/tbs/tb0571.pas
Normal file
73
tests/tbs/tb0571.pas
Normal file
@ -0,0 +1,73 @@
|
||||
{$ifdef fpc}
|
||||
{$mode delphi}
|
||||
{$endif fpc}
|
||||
|
||||
{ Some (delphi) applications expect that the QueryInterface method is invoked as first
|
||||
priority to query for an interface and GetInterface as 2nd priority }
|
||||
|
||||
uses
|
||||
sysutils;
|
||||
|
||||
type
|
||||
ITest = interface
|
||||
['{E80B0A2E-96ED-4F38-A6AC-E4E0B59F27F3}']
|
||||
end;
|
||||
|
||||
TTest = class(TObject, IUnknown, ITest)
|
||||
private
|
||||
refcount: integer;
|
||||
public
|
||||
function QueryInterface(const iid : tguid;out obj) : Hresult;stdcall;
|
||||
function _AddRef : longint;stdcall;
|
||||
function _Release : longint;stdcall;
|
||||
end;
|
||||
|
||||
var
|
||||
called: Boolean = False;
|
||||
|
||||
function TTest.QueryInterface(const IID: TGUID; out Obj): Hresult; stdcall;
|
||||
begin
|
||||
called := true;
|
||||
if getinterface(iid,obj) then
|
||||
result:=S_OK
|
||||
else
|
||||
result:=longint(E_NOINTERFACE);
|
||||
end;
|
||||
|
||||
function TTest._AddRef : longint;stdcall;
|
||||
begin
|
||||
Inc(refcount);
|
||||
result := refcount;
|
||||
end;
|
||||
|
||||
function TTest._Release : longint;stdcall;
|
||||
begin
|
||||
Dec(refcount);
|
||||
result := refcount;
|
||||
end;
|
||||
|
||||
var
|
||||
r: TTest;
|
||||
i: ITest;
|
||||
|
||||
procedure get(out obj: ITest);
|
||||
begin
|
||||
obj := r as ITest;
|
||||
end;
|
||||
|
||||
begin
|
||||
r := TTest.Create;
|
||||
r._AddRef;
|
||||
|
||||
if not supports(r, ITest, i) or not called or (r.refcount<>2) then
|
||||
Halt(1);
|
||||
called := false;
|
||||
i := nil;
|
||||
|
||||
get(i);
|
||||
if (i=nil) or not called or (r.refcount<>2) then
|
||||
Halt(1);
|
||||
i := nil;
|
||||
|
||||
r._Release;
|
||||
end.
|
Loading…
Reference in New Issue
Block a user