tw4086.pp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. { Source provided for Free Pascal Bug Report 4086 }
  2. { Submitted by "Martin Schreiber" on 2005-06-14 }
  3. { e-mail: }
  4. program project1;
  5. {$ifdef FPC}
  6. {$mode objfpc}{$H+}
  7. {$else}
  8. {$apptype console}
  9. {$endif}
  10. uses
  11. Classes,SysUtils;
  12. type
  13. itest = interface
  14. procedure testproc;
  15. end;
  16. ttestclass1 = class(tobject,itest)
  17. public
  18. function queryinterface(constref guid: tguid; out obj): hresult; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  19. function _addref: integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  20. function _release: integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  21. procedure testproc;
  22. end;
  23. ttestclass2 = class
  24. public
  25. intf: pointer;
  26. end;
  27. { ttestclass1 }
  28. function ttestclass1.queryinterface(constref guid: tguid; out obj): hresult; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  29. begin
  30. result:= integer(e_nointerface);
  31. end;
  32. function ttestclass1._addref: integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  33. begin
  34. writeln('addref called');
  35. // result:= inherited _addref;
  36. result:= -1;
  37. end;
  38. function ttestclass1._release: integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  39. begin
  40. writeln('release called');
  41. // result:= inherited _release;
  42. result:= -1;
  43. end;
  44. procedure ttestclass1.testproc;
  45. begin
  46. writeln('testproc called');
  47. end;
  48. var
  49. po1: pointer;
  50. test1: ttestclass1;
  51. test2: ttestclass2;
  52. procedure test;
  53. begin
  54. writeln('*** global variable');
  55. po1:= pointer(itest(test1));
  56. itest(po1).testproc;
  57. writeln('*** object field');
  58. test2.intf:= pointer(itest(test1));
  59. itest(test2.intf).testproc;
  60. end;
  61. begin
  62. test1:= ttestclass1.create;
  63. test2:= ttestclass2.create;
  64. test;
  65. test1.free;
  66. test2.free;
  67. end.