Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met de functie CreateProcess wordt een nieuw proces gemaakt dat onafhankelijk van het proces wordt uitgevoerd. Voor de eenvoud wordt deze relatie een ouder-kindrelatie genoemd.
Important
Beveiliging — overerving van handles: Stel bInheritHandles in op FALSE tenzij het subproces specifiek toegang moet hebben tot overgeërfde handles. Overgenomen ingangen (bestandsingangen, sockets, tokens) kunnen gevoelige resources naar onderliggende processen lekken. Wanneer overname is vereist, gebruikt STARTUPINFOEX u deze om UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) alleen de grepen die het kind nodig heeft expliciet weer te geven.
Important
lpCommandLine moet beschrijfbaar zijn: bij het doorgeven van een opdrachtregel als parameter lpCommandLine (tweede parameter), moet de buffer een schrijfbare tekenmatrix zijn , niet een letterlijke tekenreeks of const aanwijzer. De Unicode-versie (CreateProcessW) kan deze buffer direct wijzigen. Het doorgeven van een alleen-lezen tekenreeks veroorzaakt een schending van de toegang.
Note
Moderne alternatieven: Voor eenvoudigere scenario's voor het maken van processen kunt u System.Diagnostics.Process (.NET), _wspawnl/_wsystem (CRT) of ShellExecuteEx (voor het starten van documenten/URL's met werkwoordafhandeling) overwegen. Gebruik CreateProcess wanneer u volledige controle nodig hebt over overname van handles, procesattributen, beveiligingsdescriptors of aanmaakvlaggen.
De volgende code laat zien hoe u een proces maakt.
#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 );
}
Als CreateProcess- slaagt, wordt een PROCESS_INFORMATION structuur geretourneerd die ingangen en id's voor het nieuwe proces en de primaire thread bevat. De thread- en procesingangen worden gemaakt met volledige toegangsrechten, hoewel u de toegang kunt beperken als u beveiligingsdescriptors opgeeft. Wanneer u deze ingangen niet meer nodig hebt, sluit u deze met behulp van de functie CloseHandle.
U kunt ook een proces maken met behulp van de functies CreateProcessAsUser of CreateProcessWithLogonW. Met deze functies kunt u de beveiligingscontext opgeven van het gebruikersaccount waarin het proces wordt uitgevoerd.