tdispinterface2.pp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. { %TARGET=win32,win64,wince}
  2. program tdispinterface2;
  3. {$ifdef fpc}
  4. {$mode objfpc}
  5. {$endif}
  6. type
  7. { IIE }
  8. IIE = dispinterface
  9. ['{0002DF05-0000-0000-C000-000000000046}']
  10. procedure Disp300; dispid 300;
  11. property Disp1: integer;
  12. procedure Disp2;
  13. property Disp402: wordbool dispid 402;
  14. procedure DispArg1(Arg: IUnknown);
  15. procedure DispArg2(Arg: IDispatch);
  16. function DispArg3(var Arg: wordbool): widestring;
  17. end;
  18. var
  19. cur_dispid: longint;
  20. cur_argtype: byte;
  21. cur_restype: byte;
  22. {$HINTS OFF}
  23. procedure DoDispCallByID(res: Pointer; const disp: IDispatch; desc: PDispDesc;
  24. params: Pointer);
  25. begin
  26. if desc^.dispid <> cur_dispid then
  27. halt(cur_dispid);
  28. end;
  29. procedure DoDispCallByIDArg(res: Pointer; const disp: IDispatch; desc: PDispDesc;
  30. params: Pointer);
  31. begin
  32. if desc^.calldesc.argcount <> 1 then
  33. halt(4);
  34. if desc^.calldesc.argtypes[0] <> cur_argtype then
  35. halt(cur_argtype);
  36. if desc^.restype <> cur_restype then
  37. halt($FF);
  38. end;
  39. {$HINTS ON}
  40. var
  41. II: IIE;
  42. B: wordbool;
  43. begin
  44. // check dispid values
  45. DispCallByIDProc := @DoDispCallByID;
  46. cur_dispid := 300;
  47. II.Disp300;
  48. cur_dispid := 1;
  49. II.Disp1 := 1;
  50. cur_dispid := 2;
  51. II.Disp2;
  52. cur_dispid := 402;
  53. II.Disp402 := True;
  54. // check arguments
  55. DispCallByIDProc := @DoDispCallByIDArg;
  56. cur_restype := varempty;
  57. cur_argtype := varunknown;
  58. II.DispArg1(nil);
  59. cur_argtype := vardispatch;
  60. II.DispArg2(nil);
  61. cur_restype := varolestr;
  62. cur_argtype := varboolean or $80;
  63. B := False;
  64. II.DispArg3(B);
  65. end.