procedure MyTest_StdCall(a, b : integer); stdcall; begin Form1.Memo1.Lines.Add(Format('stdcall: %d + %d = %d', [a, b, a + b])); end; procedure MyTest_Cdecl(a, b : integer); cdecl; begin Form1.Memo1.Lines.Add(Format('cdecl: %d + %d = %d', [a, b, a + b])); end; procedure MyTest_Register(a, b : integer); register; begin Form1.Memo1.Lines.Add(Format('register: %d + %d = %d', [a, b, a + b])); end; // procedure TForm1.FormCreate(Sender: TObject); var newcall : pvmbruntimecall; begin Memo1.Lines.Clear; newcall := vmbrtm_new; vmbrtm_setcallconv(newcall, vmb_callconv_stdcall); vmbrtm_setaddress(newcall, @mytest_stdcall); vmbrtm_pushparam32(newcall, 13); vmbrtm_pushparam32(newcall, 5); vmbrtm_callproc(newcall); vmbrtm_del(newcall); newcall := vmbrtm_new; vmbrtm_setcallconv(newcall, vmb_callconv_cdecl); vmbrtm_setaddress(newcall, @mytest_cdecl); vmbrtm_pushparam32(newcall, 13); vmbrtm_pushparam32(newcall, 5); vmbrtm_callproc(newcall); vmbrtm_del(newcall); newcall := vmbrtm_new; vmbrtm_setcallconv(newcall, vmb_callconv_register); vmbrtm_setaddress(newcall, @mytest_register); vmbrtm_pushparam32(newcall, 13); vmbrtm_pushparam32(newcall, 5); vmbrtm_callproc(newcall); vmbrtm_del(newcall); end; { output: stdcall: 13 + 5 = 18 cdecl: 13 + 5 = 18 register: 13 + 5 = 18 }