Pada CreateProcess, baris kode program selanjutnya akan dieksekusi apabila CreateProcess telah selesai melakukan aksinya. Dengan demikian, pemakaian CreateProcess lebih menguntungkan.
CreateProcess adalah suatu fungsi yang diletakkan pada unit Windows. Deklarasi function-nya adalah sebagai berikut:
function CreateProcess(
lpApplicationName: PChar;
lpCommandLine: PChar;
lpProcessAttributes,
lpThreadAttributes: PSecurityAttributes;
bInheritHandles: BOOL;
dwCreationFlags: DWORD;
lpEnvironment: Pointer;
lpCurrentDirectory: PChar;
const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation
): BOOL; stdcall;
Pusing? Jangan bingung! Tidak semua parameter diatas kita pakai. Kita hanya memakai parameter 2,5,6,8,9,10.
Parameter 2: lpCommandline: PChar
digunakan untuk menunjukkan tempat file beserta parameter yang diperlukan agar dapat dijalankan.Panjang string yang dapat ditampung parameter ini sampai 32,768 characters. Parameter ini tidak harus diisi. Jika tidak diisi, maka ia akan menganggap paramater pertama (lpApplicationName) sebagai perintah.
Parameter 5: bInheritHandles: BOOL;
Jika diatur ke TRUE, maka setiap pemanggilan CreateProcess, akan menghasilkan handle baru yang merupakan turunan dari handle aslinya. Jika diatur ke FALSE, maka dianggap handle CreateProcess sama dengan handle aslinya.
Parameter 6: dwCreationFlags: DWORD;
Flags yang akan memberitahukan kepada windows, jenis process yang kita inginkan. Seluruhnya ada 16 Flags. Untuk aplikasi console, kita biasanya mengisinya dengan:
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS
Parameter 8: lpCurrentDirectory: PCHAR;
Adalah nama direktori tempat proses berlangsung. Jika tidak diisi, maka process dianggap pada direktori file exe pemanggil.
Parameter 9: const lpStartupInfo: TStartupInfo;
Untuk mengakses struktur TStartInfo. Strukturnya adalah sebagai berikut:
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
Tidak semua parameter diatas kita pakai. Hanya cb, dwFlags, wShowWindow.
- cb
Ukuran struktur dalam bytes. Dalam delphi kita menggunakan perintah sebagai berikut:
StartInfo.cb := System.SizeOf(StartupInfo); - dwFlags
Ada 13 pilihan untuk dwFlags. Flags yang sering dipakai adalah:
StartupInfo.dwFlags := STARTF_USESHOWWINDOW; - wShowWindow
Jika CreateProcess digunakan untuk menggantikan penggunaan console (perintah CMD), maka wShowWindow diisi dengan STARTF_USESHOWWINDOW. Penggunaan parameter STARTF_USESSHOWWINDOW memungkinkan mengatur model window yang digunakan.
Contoh:
SW_SHOW : Menunjukkan jendela console
SW_HIDE: Menyembunyikan jendela console
Sebagai contoh pemakaian, dibawah ini adalah kode program untuk menjalankan Firewall pada windows. Ada dua bagian fungsi yang akan dibuat. Pertama eksekusi utama di begin end utama dan proses CreateProcess-nya sendiri dengan nama fungsi JalankanFile yang dipanggil oleh fungsi utama.
function JalankanFile(NamaFile: String; Visibility:Integer): CARDINAL;
var
AppName : array[0..512] of char;
CurrentDir : array[0..512] of char;
WorkDir : String;
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
begin
//Kopikan NamaFile ke AppName, dari string ke PCHAR
StrPCopy(AppName, NamaFile);
//Dapatkan direktori saat ini, letakkan dalam variabel WorkDir
GetDir(0,WorkDir);
//Kopikan WorkDir sebagai String ke CurrentDir dengan type PCHAR
StrPCopy(CurrentDir, WorkDir);
//Isi variabel Startupinfo sebesar ukuran Startupinfo dengan string kosong (#0)
FillChar(StartupInfo, SizeOf(StartupInfo),#0);
StartupInfo.cb := System.SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if (not CreateProcess(nil,AppName,nil,nil,false,CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,nil,CurrentDir,StartupInfo,ProcessInfo)) then
begin
Result := $FFFFFFFF;
MessageBox(
Application.Handle,
PCHAR('Kesalahan JalankanFile ' + #13#10 +
SysErrorMessage(GetLastError)),'Kesalahan',0)
end else
begin
//untuk memberitahukan windows agar menjalankan proses sampai selesai baru melangkah
//ke baris program selanjutnya
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end;
Program pemanggilnya adalah sebagai berikut:
if Not JalankanFile('netsh advfirewall set currentprofile state on ', SW_HIDE) <> $FFFFFFFF then
begin
Application.MessageBox('Terjadi kesalahan program','Pesan Kesalahan',MB_OK);
begin
Application.MessageBox('Terjadi kesalahan program','Pesan Kesalahan',MB_OK);
end else
beginApplication.MessageBox('Proses menjalankan Firewall berhasil','Informasi',MB_OK);
end;
0 comments:
Posting Komentar