Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Fungsi CreateProcess membuat proses baru yang berjalan secara independen dari proses pembuatan. Untuk kesederhanaan, hubungan ini disebut hubungan induk-anak.
Important
Keamanan — pewarisan handle: Atur bInheritHandles ke FALSE kecuali proses turunan secara khusus memerlukan akses ke handle yang diwariskan. Handle yang diwariskan (handle file, soket, token) dapat membocorkan sumber daya sensitif ke proses anak. Ketika pewarisan diperlukan, gunakan STARTUPINFOEX dengan UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) untuk secara eksplisit hanya mencantumkan handel yang dibutuhkan anak.
Important
lpCommandLine harus dapat ditulis: Saat melewati baris perintah sebagai parameter lpCommandLine (parameter kedua), buffer harus berupa array karakter yang dapat ditulis — bukan string literal atau const pointer. Versi Unicode (CreateProcessW) dapat memodifikasi buffer ini di tempat. Memberikan string hanya-baca menyebabkan pelanggaran akses.
Note
Alternatif modern: Untuk skenario pembuatan proses yang lebih sederhana, pertimbangkan System.Diagnostics.Process (.NET), _wspawnl/_wsystem (CRT), atau ShellExecuteEx (untuk meluncurkan dokumen/URL dengan penanganan kata kerja). Gunakan CreateProcess saat Anda memerlukan kontrol penuh atas pewarisan penanganan, atribut proses, deskriptor keamanan, atau bendera pembuatan.
Kode berikut menunjukkan cara membuat proses.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _tmain( int argc, TCHAR *argv[] )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( argc != 2 )
{
printf("Usage: %s [cmdline]\n", argv[0]);
return;
}
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
Jika CreateProcess berhasil, fungsi ini mengembalikan struktur PROCESS_INFORMATION yang berisi handle dan pengidentifikasi untuk proses baru serta utas primer-nya. Utas dan handel proses dibuat dengan hak akses penuh, meskipun Anda dapat membatasi akses jika Anda menentukan deskriptor keamanan. Ketika Anda tidak lagi memerlukan handel ini, tutup dengan menggunakan fungsi closeHandle.
Anda juga dapat membuat proses dengan menggunakan fungsi CreateProcessAsUser atau CreateProcessWithLogonW. Fungsi-fungsi ini memungkinkan Anda menentukan konteks keamanan akun pengguna tempat proses berjalan.