fork download
  1. {$MODE DELPHI}
  2.  
  3. Type TCallingConvention = (cc_stdcall, cc_cdecl);
  4.  
  5. { TProcedure1 }
  6. Type TProcedure1<Arg1> =
  7. Class
  8. Type TProcedure_stdcall = Procedure(Arg1: Arg1) stdcall;
  9. TProcedure_cdecl = Procedure(Arg1: Arg1) cdecl;
  10.  
  11. Class Procedure Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1);
  12. End;
  13.  
  14. { TProcedure2 }
  15. Type TProcedure2<Arg1, Arg2> =
  16. Class
  17. Type TProcedure_stdcall = Procedure(Arg1: Arg1; Arg2: Arg2) stdcall;
  18. TProcedure_cdecl = Procedure(Arg1: Arg1; Arg2: Arg2) cdecl;
  19.  
  20. Class Procedure Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1; const Arg2: Arg2);
  21. End;
  22.  
  23. { TFunction1 }
  24. Type TFunction1<Return, Arg1> =
  25. Class
  26. Type TFunction_stdcall = Function(Arg1: Arg1): Return stdcall;
  27. TFunction_cdecl = Function(Arg1: Arg1): Return cdecl;
  28.  
  29. Class Function Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1): Return;
  30. End;
  31.  
  32. { TFunction2 }
  33. Type TFunction2<Return, Arg1, Arg2> =
  34. Class
  35. Type TFunction_stdcall = Function(Arg1: Arg1; Arg2: Arg2): Return stdcall;
  36. TFunction_cdecl = Function(Arg1: Arg1; Arg2: Arg2): Return cdecl;
  37.  
  38. Class Function Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1; const Arg2: Arg2): Return;
  39. End;
  40.  
  41. // TProcedure1.Call
  42. Class Procedure TProcedure1<Arg1>.Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1);
  43. Begin
  44. Case Conv of
  45. cc_stdcall: TProcedure_stdcall(Proc)(Arg1);
  46. cc_cdecl : TProcedure_cdecl(Proc)(Arg1);
  47. End;
  48. End;
  49.  
  50. // TProcedure2.Call
  51. Class Procedure TProcedure2<Arg1, Arg2>.Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1; const Arg2: Arg2);
  52. Begin
  53. Case Conv of
  54. cc_stdcall: TProcedure_stdcall(Proc)(Arg1, Arg2);
  55. cc_cdecl : TProcedure_cdecl(Proc)(Arg1, Arg2);
  56. End;
  57. End;
  58.  
  59. // TFunction1.Call
  60. Class Function TFunction1<Return, Arg1>.Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1): Return;
  61. Begin
  62. Case Conv of
  63. cc_stdcall: Result := TFunction_stdcall(Proc)(Arg1);
  64. cc_cdecl : Result := TFunction_cdecl(Proc)(Arg1);
  65. End;
  66. End;
  67.  
  68. // TFunction2.Call
  69. Class Function TFunction2<Return, Arg1, Arg2>.Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1; const Arg2: Arg2): Return;
  70. Begin
  71. Case Conv of
  72. cc_stdcall: Result := TFunction_stdcall(Proc)(Arg1, Arg2);
  73. cc_cdecl : Result := TFunction_cdecl(Proc)(Arg1, Arg2);
  74. End;
  75. End;
  76.  
  77. // MyProc
  78. Procedure MyProc(const Param: Integer); stdcall;
  79. Begin
  80. Writeln('Param = ', Param);
  81. End;
  82.  
  83. // MyFunc
  84. Function MyFunc(const Param1, Param2: Integer): Integer; cdecl;
  85. Begin
  86. Result := Param1*Param2;
  87. End;
  88.  
  89. Begin
  90. TProcedure1<Integer>.Call(@MyProc, cc_stdcall, 512);
  91. Writeln(TFunction2<Integer, Integer, Integer>.Call(@MyFunc, cc_cdecl, 10, 20));
  92. Readln;
  93. End.
Success #stdin #stdout 0s 232KB
stdin
Standard input is empty
stdout
Param = 512
200