Ide ini saya dapatkan ketika saya mencoba membuat aplikasi SMS Gateway menggunakan Delphi, Gammu, dan MySQL. Ada beberapa konfigurasi Gammu yang harus dilakukan via Console Command Prompt. Saya berpikiran, bagaimana cara menjalankan konfigurasi dan menampilkan outputnya melalui Delphi (tanpa membuka Command Prompt). Untuk menjalankan, kita bisa menggunakan ShellExecute API milik Delphi. Namun untuk outputnya?

Akhirnya, setelah googling, saya mendapatkan dua ide ide untuk menjalankan dan menampilkan output Command Prompt via Delphi. Ide pertama adalah mengunakan ShellExecute dengan menambahkan beberapa parameter sehingga outputnya disimpan ke sebuah file, kemudian dari Delphi file tersebut dibaca. Sebagai contoh, saya ingin menjalankan perintah dir sebagai berikut:

DIR > dir.txt

atau

DIR >> dir.txt

Perintah pertama, menyimpan output yang diberikan  dari perintah DIR ke dalam file dir.txt. Perintah kedua, sama dengan perintah pertama. Bedanya, perintah yang pertama, akan selalu menuliskan dir.txt dari awal (dihapus jika sudah ada), sebaliknya, perintah kedua akan menambahkan output di baris berikutnya. Kemudian file dir.txt ditampilkan menggunakan Delphi. Kekurangan metode ini adalah, kita tidak tahu kapan Command Prompt selesai mengeksekusi perintah. Sebagai contoh, perintah SCANDISK -f, akan memakan waktu yang lebih lama dari pada perintah DIR. Sehingga, kita tidak tahu kapan perintah tersebut selesai dieksekusi. Jika perintah selesai dieksekusi, maka file output contohnya dir.txt di atas, dapat dibaca dan menampilkan hasil yang sesuai.

Ide kedua, adalah membuat aplikasi ‘sejenis’ Command Prompt. Berikut ini langkah-langkahnya.

Pertama, buat aplikasi baru. Saya menambahkan sebuah Edit, Button, dan Memo. Atur posisinya sehingga tampilannya paling tidak seperti ini (atau sesuai selera) :

Deklarasikan sebuah fungsi pada bagian private milik form:

function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string;

Pada bagian implementation, tuliskan script berikut:

function TForm1.GetDosOutput(CommandLine: string; Work: string = 'C:\'): string;
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
WasOK: Boolean;
Buffer: array[0..255] of AnsiChar;
BytesRead: Cardinal;
WorkDir: string;
Handle: Boolean;
begin
Result := '';
with SA do begin
nLength := SizeOf(SA);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
try
with SI do
begin
FillChar(SI, SizeOf(SI), 0);
cb := SizeOf(SI);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
WorkDir := Work;
Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
nil, nil, True, 0, nil,
PChar(WorkDir), SI, PI);
CloseHandle(StdOutPipeWrite);
if Handle then
try
repeat
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
if BytesRead > 0 then
begin
Buffer[BytesRead] := #0;
Result := Result + Buffer;
end;
until not WasOK or (BytesRead = 0);
WaitForSingleObject(PI.hProcess, INFINITE);
finally
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
finally
CloseHandle(StdOutPipeRead);
end;
end;

Selanjutnya, double click button1, lalu ketikkan script berikut ini :

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := false;
Memo1.Text := GetDosOutput(Edit1.Text);
Button1.Enabled := true;
end;

Selesai. Jalankan. Berikut ini salah satu tampilan program tersebut:

OK. Selamat mencoba


Posted Under Category: Matematika


One Response to Parse Output Command Prompt (Console) via Delphi

  1. ismanpunggul says:

    Saya kurang ngerti dengan “bahasa” kaya gitu. Yang jelas Bapak telah berinovasi dan berhasil pula mengaplikasikan serta me-publikasikannya. Trus berkarya Pak!

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Quranic Verse


Categories


Portal Akademik


Portal E-Learning


My Affiliate

Join 4Shared Now!


My Face-book


Twitter


Yahoo! Messanger


My Count's