Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
CreateProcess işlevi, oluşturma işleminden bağımsız olarak çalışan yeni bir işlem oluşturur. Kolaylık olması için bu ilişkiye ebeveyn-çocuk ilişkisi denir.
Important
Güvenlik — tanıtıcı devralma: Alt sürecin devralınan tanıtıcılara özel olarak erişmesi gerekmediği sürece bInheritHandles değerini FALSE olarak ayarlayın. Devralınan işleyiciler (dosya işleyicileri, soketler, belirteçler), hassas kaynakların alt süreçlere sızmasına neden olabilir. Devralma gerektiğinde, alt sürecin gereksinim duyduğu tanıtıcıları açıkça yalnızca listelemek için STARTUPINFOEX ile UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) kullanın.
Important
lpCommandLine yazılabilir olmalıdır: Bir komut satırı lpCommandLine parametresi (ikinci parametre) olarak geçirildiğinde, arabellek yazılabilir bir karakter dizisi olmalıdır; dize sabiti veya const işaretçisi olmamalıdır. Unicode sürümü (CreateProcessW) bu arabelleği yerinde değiştirebilir. Salt okunur bir dizenin iletilmesi erişim ihlaline neden olur.
Note
Modern alternatifler: Daha basit işlem oluşturma senaryoları için System.Diagnostics.Process (.NET), _wspawnl/_wsystem (CRT) veya ShellExecuteEx (fiil işleme ile belgeleri/URL'leri başlatmak için) göz önünde bulundurun. Devralma, işlem öznitelikleri, güvenlik tanımlayıcıları veya oluşturma bayrakları üzerinde tam denetime ihtiyacınız olduğunda kullanın CreateProcess .
Aşağıdaki kodda bir işlemin nasıl oluşturulacağı gösterilmektedir.
#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 );
}
CreateProcess başarılı olursa, yeni işlemin ve birincil iş parçacığının tanıtıcılarını ve tanımlayıcılarını içeren bir PROCESS_INFORMATION yapısı döndürür. İş parçacığı ve işlem tanıtıcıları tam erişim haklarıyla oluşturulur, ancak güvenlik tanımlayıcıları belirtirseniz erişimi kısıtlayabilirsiniz. Bu tanıtıcılara artık ihtiyacınız kalmadığında, bunları CloseHandle işlevini kullanarak kapatın.
CreateProcessAsUser veya CreateProcessWithLogonW işlevlerini kullanarak da bir işlem oluşturabilirsiniz. Bu işlevler, işlemin çalıştırıldığı kullanıcı hesabının güvenlik bağlamını belirtmenize olanak tanır.