12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- {$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.
|