CreateProcess

ŁF
// C
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
);
// Delphi
function CreateProcess(lpApplicationName: PChar; lpCommandLine: PChar;
  lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall;

Funkcja CreateProcess tworzy nowy proces.

Parametry:
lpApplicationName
Łańcuch znaków zawierający nazwę modułu do uruchomienia. Modułem tym może być aplikacja Windows lub dowolna inna obsługiwana przez odpowiedni podsystem (np.: MS-DOS, OS/2).
Parametr ten może zawierać pełną ścieżkę do pliku lub tylko jej część. W drugim wypadku funkcja użyje bieżącego dysku i bieżącego katalogu aby uzupełnić ścieżkę. Jeśli w nazwie pliku nie zostało podane rozszerzenie, funkcja doda rozszerzenie .exe. Z tego powodu aby uruchomić plik .com należy podać nazwę pliku wrac z rozszerzeniem .com.

Parametr ten może przyjąć wartość NULL. W takim wypadku nazwa modułu musi być podana na początku parametru lpCommandLine.

Jeśli używasz ścieżki do pliku ze spacjami, umieść ją w cudzysłowach, np. "c:\program files\sub dir\program name". W przeciwnym razie ścieżka do pliku nie jest jednoznaczna; system usiłuje wtedy odnaleźć plik wg. następującego schematu:
c:\program.exe files\sub dir\program name
c:\program files\sub.exe dir\program name
c:\program files\sub dir\program.exe name
c:\program files\sub dir\program name.exe

Jeśli chcesz uruchomić plik .bat, parametr lpApplicationName powinien zawierać nazwę pliku z interpreterem poleceń (cmd.exe), a parametr lpCommandLine nazwę pliku wsadowego (.bat).

lpCommandLine
Łańcuch znaków z linią poleceń dla tworzonego procesu. Maksymalna długość wynosi 32K znaków (pod Windows 2000 maksymalna długość wynosi MAX_PATH znaków).

Wersja Unicode tej funkcji, CreateProcessW, może zmieniać zawartość tego parametru, dlatego lpCommandLine nie może być wskaźnikiem do bloku pamięci w trybie read-only (funkcja zwraca wtedy błąd ERROR_INVALID_USER_BUFFER lub zgłasza błąd dostępu - acces violation).

Jeśli parametr ten ma wartość NULL, funkcja użyje jako linii poleceń łańcucha znaków podanego w parametrze lpApplicationName.
Jeśli lpApplicationName oraz lpCommandLine mają wartość inną niż NULL, lpApplicationName oznacza nazwę modułu do uruchomienia, a lpCommandLine zawiera linię poleceń. Nowo utworzony proces może otrzymać zawartość linii poleceń używając funkcji GetCommandLine.

Jeśli lpApplicationName ma wartość NULL, nazwa modułu pobierana jest z lpCommandLine. Wtedy nazwa modułu jest pobierana z linii poleceń (do pierwszej spacji bądź do drugiego cudzysłowu). Jeśli nazwa nie zawiera rozszerzenia, dodawane jest .exe; jeśli nazwa kończy się kropką lub zawiera ścieżkę z katalogami, rozszerzenie nie jest dodawane. Jeśli nie jest podany katalog, plik z modułem jest wyszukiwany w następujących katalogach:

  1. Katalog z którego została załadowana aplikacja
  2. Bieżący katalog dla procesu-rodzica
  3. Katalog system32 (funkcja GetSystemDirectory zwróci pełną ścieżkę do niego)
  4. Katalog system
  5. Katalog Windows (funkcja GetWindowsDirectory zwróci pełną ścieżkę do niego)
  6. Katalogi zawarte w zmiennej środowiskowej PATH; funkcja CreateProcess nie będzie wyszukiwać w ścieżkach dla aplikacji zdefiniowanych w rejestrze (klucz App Paths); aby wymusić użycie tych ścieżek, należy uzyć funkcji ShellExecute.

System dodaje znak 0 do linii poleceń, aby oddzielić nazwę plików od argumentów jego wywołania.

lpProcessAttributes
lpThreadAttributes
bInheritHandles
dwCreationFlags
lpEnvironment
lpCurrentDirectory
lpStartupInfo
lpProcessInformation

Wartość zwracana
Jeśli funkcja się powiedzie, zwraca wartość różną od zera (True).

Jeśli funkcja się nie powiedzie, zwraca wartość 0 (False). Dodatkowe informacje o błędzie można pobrać za pomocą funkcji GetLastError.

Uwagi
Windows 95/98/Me: Wersja Unicode funkcji (CreateProcessW) jest wspierana przez Warstwę Unicode (Microsoft Layer for Unicode) - MSLU. Aby użyć funkcji w wersji Unicode, należy dokonać pewnych zmian w aplikacji wedle wskazówek nakreślonych w Microsoft Layer for Unicode on Windows 95/98/Me Systems (eng)

Zobacz też:

Artykuł został umieszczony na liście [[Zalazki artykulow|Zalążków artykułów]]. Jeżeli możesz rozbuduj go!

1 komentarz

manfredek: utarło się stosować wersję bez ramek dla deklaracji w dziale WinAPI