Menangani pesan kesalahan: Unsupported calling convention: REGISTER

Dear Rekan-rekan Delphier dan atau Guru-guru pemrograman Delphi di Seluruh Indonesia,

Saya ingin berbagi ilmu troubleshooting ketika bekerja dengan menggunakan soap server application.

Bagi para pemula pengguna Web Service dengan Delphi tentu dan pasti akan menjumpai hal-hal kecil yang menjadi kesalahan karena kurangnya ilmu atau wawasan seputar penggunakan SOAP pada Delphi dan juga aturan implementasinya.



Jika tidak hati-hati dalam setiap menciptakan method sering kali kelupaan menambahkan tanda-tanda khusus karena hanya ingin cepat-cepat selesai dan mencoba apakah berhasil atau tidak.

tentu budaya atau kebiasaan seperti ini tidak baik, sebab yang demikian ini akan menguras tenaga, waktu dan ujungnya menjadi pekerjaan rutinitas yang sangat membosankan.

ketika saya hendak mencoba membuatkan contoh project web service dan clientnya dengan menggunakan Delphi. Saya mendapati ada pesan kesalahan ketika aplikasi dijalankan. Pesan kesalahan tersebut adalah seperti ditunjukkan dibawah ini:

"Unsupported calling convention: REGISTER"

Pesan kesalahan ini biasanya muncul ketika membuat web service dengan menggunakan Delphi 7, sebab ketika saya menggunakan Delphi XE4 tidak ada masalah dengan kode program yang sama. Untuk Delphi setelah Delphi 7 dan sebelum Delphi XE4 belum saya test dan bagi yang ingin memastikannya silahkan dicoba dan dishare hasil percobaannya disini.

Isu atau pesan kesalahan diatas muncul karena programer lupa dalam setiap mendeklarasikan dan membuat method tidak memberikan identifikasi dengan stdcall.

solusi untuk permasalahan ini adalah cukup dengan menambahkan stdcall pada setiap method yang dideklarasikan pada sisi server(SOAP Server).

Kemudian tambahan juga bahwa penambahan itu dilakukan tidak hanya pada sisi interface saja, namun juga pada sisi implementationnya juga.

Contoh sisi interface:

...
{ Invokable interface ITest }

unit TestIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns,Unit4;

type

  { Invokable interfaces must derive from IInvokable }
  ITest = interface(IInvokable)
  ['{4D02FC3C-8588-4EBA-95E6-B2104F181843}']

    { Methods of Invokable interface must not use the default }
    function GetInformation: string;  stdcall;
    function GetCustomer: TCustomer;stdcall;
    { calling convention; stdcall is recommended }
  end;

implementation


initialization
  { Invokable interfaces must be registered }
  InvRegistry.RegisterInterface(TypeInfo(ITest));

end.
...

sisi implementation:

...
{ Invokable implementation File for TTest which implements ITest }

unit TestImpl;

interface

uses InvokeRegistry, Types, XSBuiltIns, TestIntf,Unit4;

type

  { TTest }
  TTest = class(TInvokableClass, ITest)
  public
  published
    function GetInformation: string;  stdcall;
    function GetCustomer: TCustomer; stdcall;
  end;

implementation



{ TTest }

function TTest.GetCustomer: TCustomer;
begin
  Result := TCustomer.Create;
  Result.Nama := 'Gracio';
  Result.Kota := 'Surabaya';
end;

function TTest.GetInformation: string;
begin
    Result := 'Eko Indriyawan';
end;

initialization
  { Invokable classes must be registered }
  InvRegistry.RegisterInvokableClass(TTest);

end.
...

Semoga sharing diatas bisa bermanfaat dan sangat bermanfaat bagi mereka yang ingin memperdalam ilmu web service dengan menggunakan bahasa pemrograman Delphi.

Salam,

by : Eko Indriyawan

Comments