{$MODE DELPHI}
Type TCallingConvention = (cc_stdcall, cc_cdecl);
{ TProcedure1 }
Type TProcedure1<Arg1> =
Class
Type TProcedure_stdcall = Procedure(Arg1: Arg1) stdcall;
TProcedure_cdecl = Procedure(Arg1: Arg1) cdecl;
Class Procedure Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1);
End;
{ TProcedure2 }
Type TProcedure2<Arg1, Arg2> =
Class
Type TProcedure_stdcall = Procedure(Arg1: Arg1; Arg2: Arg2) stdcall;
TProcedure_cdecl = Procedure(Arg1: Arg1; Arg2: Arg2) cdecl;
Class Procedure Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1; const Arg2: Arg2);
End;
{ TFunction1 }
Type TFunction1<Return, Arg1> =
Class
Type TFunction_stdcall = Function(Arg1: Arg1): Return stdcall;
TFunction_cdecl = Function(Arg1: Arg1): Return cdecl;
Class Function Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1): Return;
End;
{ TFunction2 }
Type TFunction2<Return, Arg1, Arg2> =
Class
Type TFunction_stdcall = Function(Arg1: Arg1; Arg2: Arg2): Return stdcall;
TFunction_cdecl = Function(Arg1: Arg1; Arg2: Arg2): Return cdecl;
Class Function Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1; const Arg2: Arg2): Return;
End;
// TProcedure1.Call
Class Procedure TProcedure1<Arg1>.Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1);
Begin
Case Conv of
cc_stdcall: TProcedure_stdcall(Proc)(Arg1);
cc_cdecl : TProcedure_cdecl(Proc)(Arg1);
End;
End;
// TProcedure2.Call
Class Procedure TProcedure2<Arg1, Arg2>.Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1; const Arg2: Arg2);
Begin
Case Conv of
cc_stdcall: TProcedure_stdcall(Proc)(Arg1, Arg2);
cc_cdecl : TProcedure_cdecl(Proc)(Arg1, Arg2);
End;
End;
// TFunction1.Call
Class Function TFunction1<Return, Arg1>.Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1): Return;
Begin
Case Conv of
cc_stdcall: Result := TFunction_stdcall(Proc)(Arg1);
cc_cdecl : Result := TFunction_cdecl(Proc)(Arg1);
End;
End;
// TFunction2.Call
Class Function TFunction2<Return, Arg1, Arg2>.Call(const Proc: Pointer; const Conv: TCallingConvention; const Arg1: Arg1; const Arg2: Arg2): Return;
Begin
Case Conv of
cc_stdcall: Result := TFunction_stdcall(Proc)(Arg1, Arg2);
cc_cdecl : Result := TFunction_cdecl(Proc)(Arg1, Arg2);
End;
End;
// MyProc
Procedure MyProc(const Param: Integer); stdcall;
Begin
Writeln('Param = ', Param);
End;
// MyFunc
Function MyFunc(const Param1, Param2: Integer): Integer; cdecl;
Begin
Result := Param1*Param2;
End;
Begin
TProcedure1<Integer>.Call(@MyProc, cc_stdcall, 512);
Writeln(TFunction2<Integer, Integer, Integer>.Call(@MyFunc, cc_cdecl, 10, 20));
Readln;
End.