Składnia
#include <windows.h>
BOOL WINAPI CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
Argumenty
Zwracana wartość
Jeśli funkcja zakończy się powodzeniem, zwrócona wartość jest niezerowa. W przeciwnym razie, funkcja zwraca zero. Aby otrzymać informacje o błędzie, wywołaj GetLastError().
Należy pamiętać, że funkcja kończy się zanim proces zakończy inicjalizację. Jeśli proces nie będzie mógł znaleźć wymaganych plików lub nie będzie mógł się zainicjalizować, proces zostanie zakończony. Aby otrzymać informacje o zakończeniu procesu, wywołaj GetExitCodeProcess().
Opis szczegółowy
Proces ma przypisany identyfikator procesu (PID). Ten identyfikator jest prawidłowy aż do zakończenia procesu. Może być użyty do identyfikacji procesu lub do otwarcia uchwytu do procesu przez OpenProcess(). Główny wątek również ma przypisany identyfikator. Jest on poprawny dopóki wątek nie zostanie zakończony. Można go użyć w OpenThread() do otwarcia uchwytu tego wątku. Te identyfikatory są zwrócone w strukturze PROCESS_INFORMATION.
Nazwa pliku wykonywalnego w wierszu poleceń który system zapewnia procesowi nie musi być identyczna z nazwą podaną w funkcji CreateProcess. System może podać procesowi pełną ścieżkę do pliku wykonywalnego gdy w funkcji jest podana niepełna ścieżka.
Proces wywołujący może wywołać funkcję WaitForInputIdle() by zaczekać na pełną inicjalizację nowego procesu i jego gotowość do przyjmowania danych gdy (już) nie ma żadnych oczekujących danych wejściowych. To może być pomocne w synchronizacji procesu wywołującego i potomnego gdyż funkcja CreateProcess() nie czeka na zakończenie inicjalizacji nowego procesu.
Najlepszym sposobem na zakończenie procesu jest wywołanie ExitProcess(), ponieważ funkcja ta wysyła komunikat informujący o zbliżającym się końcu procesu do wszystkich plików DLL dołączonych do tego procesu. Inne sposoby zakańczania procesu nie informują dołączonych plików DLL. Gdy wątek wywołuje ExitProcess(), pozostałe wątki procesu są zakańczane bez możliwości wykonania żadnego dodatkowego kodu.
Proces wywołujący może bezpośrednio zmieniać zmienne środowiskowe procesu potomnego podczas jego tworzenia. To jedyna sytuacja, gdy proces może bezpośrednio zmieniać ustawienia środowiskowe innego procesu.
Jeśli proces jest utworzony z ustawioną flagą CREATE_NEW_PROCESS_GROUP, zostaje wykonane niejawne wywołanie SetConsoleCtrlHandler(NULL, TRUE) w imieniu nowego procesu. To oznacza, że nowy proces ma wyłączone Ctrl+C. To pozwala na inną obsługę skrótu Ctrl+C przez powłoki lub selektywne wysyłanie tego sygnału do podprocesów. Ctrl+Break nie jest wyłączone i można w ten sposób zakończyć proces lub grupę procesów.
Przykład
#include <windows.h>
#include <cstdio>
const char * cmd = "prog";
int main() {
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory( & pi, sizeof( pi ) );
ZeroMemory( & si, sizeof( si ) );
si.cb = sizeof( si );
if( !CreateProcess( NULL,
( LPSTR ) cmd,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
& si,
& pi ) )
{
printf( "Could not create process. (%ld)", GetLastError() );
return 1;
}
WaitForSingleObject( pi.hProcess, INFINITE );
DWORD exitcode;
if( !GetExitCodeProcess( pi.hProcess, & exitcode ) ) {
printf( "Could not get process exit code. (%ld)", GetLastError() );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return 1;
}
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
printf( "Process returned: %ld", exitcode );
}
Process returned: 42
Wymagania
Dodatkowe informacje
Niniejsze pojęcie jeszcze nie zostało wyczerpująco przez nas opracowane. Więcej informacji na temat niniejszego hasła znajdziesz pod adresem
http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx.
Linki zewnętrzne