12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- { %opt=-gh }
- program aIntfTest;
- {$ifdef fpc}
- {$mode delphi}
- {$endif}
- {$APPTYPE CONSOLE}
- uses
- SysUtils, Classes;
-
-
- type
- IMyIntf = interface
- ['{34326401-7B67-40FF-8E92-4587F65C8E24}']
- function GetOwner: IMyIntf;
- procedure Poing;
- end;
- type
- TMYClass = clasS(TinterfacedObject, IMyIntf)
- fRef: Integer;
- public
- function GetOwner: IMyIntf;
- function QueryInterface(constref IID: TGUID; out Obj): HRESULT; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
- function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
- function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
- procedure Poing;
- end;
-
- { TMYClass }
-
- function TMYClass._AddRef: Integer;
- begin
- inc(fRef);
- result := fRef;
- Writeln('AddRef:'+inttostr(result));
- end;
-
- function TMYClass._Release: Integer;
- begin
- Dec(fRef);
- result := FRef;
- Writeln('Release:'+inttostr(result));
- if result = 0 then Free;
- end;
-
- function TMYClass.GetOwner: IMyIntf;
- begin
- Writeln('GetOwner1');
- result := nil;
- Writeln('GetOwner2');
- end;
-
- function TMYClass.QueryInterface(constref IID: TGUID; out Obj): HRESULT;
- begin
- if GetInterface(IID, Obj) then
- result := S_OK else result := -1;
- end;
-
- var
- r: IMyIntf;
- procedure Test(x: IMyIntf);
- begin
- if x <> nil then x.Poing;
- x := x.GetOwner;
- if x <> nil then x.Poing;
- end;
- procedure TMYClass.Poing;
- begin
- writeln('poing');
- end;
- begin
- HaltOnNotReleased := true;
- r := TMYClass.Create;
- Test(r);
- Writeln('nil');
- r := nil;
- end.
|