Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Funkce CreateProcess vytvoří nový proces, který běží nezávisle na procesu vytváření. Pro zjednodušení se tato relace nazývá vztah nadřazený-podřízený.
Important
Zabezpečení – dědičnost popisovačů: Nastavte bInheritHandles na FALSE, pokud podřízený proces výslovně nepotřebuje přístup ke zděděným popisovačům. Zděděné popisovače (popisovače souborů, sokety, tokeny) mohou zpřístupnit citlivé prostředky podřízeným procesům. Pokud je vyžadována dědičnost, použijte STARTUPINFOEXUpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) ji k explicitnímu výpisu pouze popisovačů, které dítě potřebuje.
Important
lpCommandLine musí být zapisovatelný: Při předávání příkazového řádku jako parametru lpCommandLine (druhého parametru) musí jít o zapisovatelné pole znaků — nikoli o řetězcový literál nebo const ukazatel. Verze Unicode (CreateProcessW) může tuto vyrovnávací paměť upravit přímo na místě. Předání řetězce určeného pouze pro čtení způsobí porušení přístupu.
Note
Moderní alternativy: Pro jednodušší scénáře vytváření procesů zvažte System.Diagnostics.Process (.NET), _wspawnl/_wsystem (CRT) nebo ShellExecuteEx (pro spouštění dokumentů a adres URL pomocí zpracování sloves). Použijte CreateProcess , když potřebujete úplnou kontrolu nad dědičností, atributy procesu, popisovači zabezpečení nebo příznaky vytváření.
Následující kód ukazuje, jak vytvořit proces.
#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 );
}
Pokud je volání CreateProcess úspěšné, vrátí strukturu PROCESS_INFORMATION, která obsahuje popisovače a identifikátory nového procesu a jeho primárního vlákna. Popisovače vláken a procesů se vytvářejí s plnými přístupovými právy, ačkoli přístup můžete omezit, pokud určíte deskriptory zabezpečení. Pokud už tyto popisovače nepotřebujete, zavřete je pomocí funkce CloseHandle.
Proces můžete také vytvořit pomocí CreateProcessAsUser nebo CreateProcessWithLogonW funkcí. Tyto funkce umožňují určit kontext zabezpečení uživatelského účtu, ve kterém se proces spouští.