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:








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