Menggunakan CreateProcess untuk Menjalankan Program Lain

Adakalanya kita menginginkan agar program lain dapat dijalankan pada program buatan sendiri. Kita dapat saja menggunakan ShellExecute. Tetapi pada ShellExecute, kita tidak dapat menentukan kapan waktu eksekusi selesai. Sehingga jika pada baris kode program berikutnya, ditentukan oleh selesai/tidak selesainya ShellExecute, kita sangat susah menentukannya.

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.
  1. cb
    Ukuran struktur dalam bytes. Dalam delphi kita menggunakan perintah sebagai berikut:
    StartInfo.cb := System.SizeOf(StartupInfo);
  2. dwFlags
    Ada 13 pilihan untuk dwFlags. Flags yang sering dipakai adalah:
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  3. 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
Parameter 10: var lpProcessInformation: TProcessInformation;   Untuk mengakses struktir PROCESS_INFORMATION untuk informasi identifikasi tentang proses baru yang dijalankan CreateProcess.

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);
end else
begin
    Application.MessageBox('Proses menjalankan Firewall berhasil','Informasi',MB_OK);
end;

  

Menggunakan CreateProcess untuk Menjalankan Program Lain Rating: 4.5 Diposkan Oleh: Good Dreamer

0 comments:

Posting Komentar

Diberdayakan oleh Blogger.