Suatu hari aku memiliki pekerjaan yang mengharuskanku untuk membuat sebuah RPC yang sesederhana mungkin dan fungsional dengan lazarus. Menurutku sih itu mudah banget secara dah banyak komponen socket TCP/IP dan contoh program server HTTP jadi aku berencana memakai http protokol sebagai sarana komunikasi server dengan kliennya.
Tapi entah kenapa kok saya tiba-tiba malas banget untuk meregistrasi setiap prosedur yang dipublish oleh modul web servicenya, sehingga aku membuat sebuah fungsi untuk meregistrasi semua fungsi didalam class modul servis yang dipublish secara otomatis dari informasi class itu.
Pertama-tama aku mencoba mendeklarasikan tipe untuk mengakses struktur tabel method dari suatu class di lazarus, sebagai berikut:
type
tmethodnamerec = packed record
name : pshortstring;
addr : pointer;
end;
tmethodnametable = packed record
count : dword;
entries : packed array[0..0] of tmethodnamerec;
end;
pmethodnametable = ^tmethodnametable;
// type untuk menjalankan method lengkap dengan parameternya
TTestMethod = procedure(const AData: String) of object;
Setelah itu semua method yang akan diakses dideklarasikan sebagai published, sebagai berikut:
type
TMyApplication = class(TCustomApplication)
published
procedure TestReadMethod;
procedure Test1(const AData: String);
.
.
Kemudian berikut method yang digunakan untuk membaca daftar method terpublish dan contoh menjalankan sebuah method dengan string:
procedure TMyApplication.TestReadMethod;
var
methodtable : pmethodnametable;
i : dword;
ovmt : PVmt;
m : TTestMethod; begin
ovmt:=PVmt(self.ClassType);
while assigned(ovmt) do
begin
methodtable:=pmethodnametable(ovmt^.vMethodTable);
if assigned(methodtable) then
begin
for i:=0 to methodtable^.count-1 do
begin
WriteLn('Found method: ',methodtable^.entries[i].name^);
// jika menemukan fungsi Test1 jalankan dengan parameter 'Halo'
if (SameText(methodtable^.entries[i].name^,'Test1')) then
begin
TMethod(m).Code := methodtable^.entries[i].addr;
TMethod(m).Data := Self;
m('Halo');
end;
end;
end;
ovmt := ovmt^.vParent;
end;
end;
Source code dari contoh fungsi yang dijalankan:
procedure TMyApplication.Test1(const AData: String);
begin
WriteLn('Test1 dijalankan dgn parameter ',AData);
end;
Dari contoh program di atas output program yang didapatkan adalah sebagai berikut:
Dari output di atas bisa disimpulkan bahwa source code yang saya buat telah berhasil membaca daftar method dari class dan menjalankan salah satu fungsi dengan String.
Sekian contoh pengalaman saya dalam membuat fungsi untuk membaca method secara otomatis dari class di lazarus, semoga bermanfaat.
Tidak ada komentar:
Posting Komentar