Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A CreateProcess függvény létrehoz egy új folyamatot, amely a létrehozási folyamattól függetlenül fut. Az egyszerűség kedvéért ezt a kapcsolatot szülő-gyermek kapcsolatnak nevezzük.
Important
Biztonság – leíróöröklés: Állítsa a bInheritHandles értékét FALSE értékre, kivéve, ha az utódfolyamatnak kifejezetten hozzá kell férnie az örökölt leírókhoz. Az örökölt fogantyúk (fájlfogantyúk, foglalatok, tokenek) érzékeny erőforrásokat szivárogtathatnak az alfolyamatokhoz. Ha öröklésre van szükség, használja a(z) STARTUPINFOEX elemet a(z) UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_HANDLE_LIST, ...) elemmel együtt, hogy kifejezetten csak a gyermekfolyamat számára szükséges kezelőket sorolja fel.
Important
Az lpCommandLine paraméternek írhatónak kell lennie: Ha parancssort ad át lpCommandLine paraméterként (második paraméter), a puffernek írható karaktertömbnek kell lennie – nem sztringkonstansnak vagy const mutatónak. A Unicode-verzió (CreateProcessW) módosíthatja ezt a puffert. Egy írásvédett karakterlánc átadása hozzáférési hibát okoz.
Note
Modern alternatívák: Egyszerűbb folyamatlétrehozási forgatókönyvek esetén fontolja meg a System.Diagnostics.Process (.NET), (CRT) _wspawnl/_wsystem vagy a ShellExecuteEx (dokumentumok/URL-címek igekezeléssel történő elindítását). Akkor használható CreateProcess , ha teljes körű vezérlésre van szüksége az öröklés, a folyamatattribútumok, a biztonsági leírók vagy a létrehozási jelzők felett.
Az alábbi kód bemutatja, hogyan hozhat létre folyamatot.
#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 );
}
Ha CreateProcess sikeres, egy PROCESS_INFORMATION struktúrát ad vissza, amely az új folyamat és elsődleges szál leíróit és azonosítóit tartalmazza. A szál- és folyamatleírók teljes hozzáférési jogosultságokkal jönnek létre, de biztonsági leírók megadása esetén korlátozhatja a hozzáférést. Ha már nincs szüksége ezekre a fogópontokra, zárja be őket a CloseHandle függvénnyel.
A folyamatot a CreateProcessAsUser vagy a CreateProcessWithLogonW függvények is létrehozhatja. Ezek a függvények lehetővé teszik annak a felhasználói fióknak a biztonsági környezetének megadását, amelyben a folyamat fut.