INTEGER CreateProcess(
lpApplicationName STRING, && Název spouštěného modulu
lpCommandLine STRING, && Příkazový řádek
lpProcessAttributes INTEGER, && Bezpečnostní atributy procesu
lpThreadAttributes INTEGER, && Bezpečnostní atributy threadu
bInheritHandles INTEGER, && Handle inheritance flag
dwCreationFlags INTEGER, && Příznak vytvoření procesu
lpEnvironment INTEGER, && Ukazatel na nový blok prostředí
@lpCurrentDirectory STRING, && Ukazatel na název startovacího adresáře
@lpStartupInfo STRING, && Ukazatel na STARTUPINFO
@lpProcessInformation STRING && Ukazatel na PROCESS_INFORMATION
)
- Parametr:
- lpApplicationName
- Název spouštěného modulu. Může být prázdný, ale pak musí být vyplněn parametr lpCommandLine.
- lpCommandLine
- Příkazový řádek. Může být prázdný, ale pak musí být vyplněn parametr lpApplicationName.
- lpProcessAttributes
- Bezpečnostní atributy procesu. Pouze pro Windows NT a vyšší, může být .NULL. .
- lpThreadAttributes
- Bezpečnostní atributy threadu. Pouze pro Windows NT a vyšší, může být .NULL. .
- bInheritHandles
- Handle inheritance flag. Příznak,zda nový proces zdědí handly z volaného procesu. Jestliže ANO , pak každý zděděný otevřený handle ve volaném procesu je předán novému procesu. Předané handly mají stejná přístupová práva,jako původní,zděděné.
- dwCreationFlags
- Příznak vytvoření procesu. Kumulativní příznak pro vytvoření procesu. Je to součet některých z níže uvedených konstant:
CREATE_DEFAULT_ERROR_MODE, CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, CREATE_SEPARATE_WOW_VDM, CREATE_SHARED_WOW_VDM, CREATE_SUSPENDED, CREATE_UNICODE_ENVIRONMENT, DEBUG_PROCESS, DEBUG_ONLY_THIS_PROCESS, DETACHED_PROCESS a NORMAL_PRIORITY_CLASS nebo IDLE_PRIORITY_CLASS nebo HIGH_PRIORITY_CLASS nebo REALTIME_PRIORITY_CLASS
Nás zajímá pouze konstanta NORMAL_PRIORITY_CLASS, která určuje prioritu nově spuštěného procesu.
- lpEnvironment
- Ukazatel na blok prostředí. Pokud parametr není zadán, pak nový proces použije blok prostředí volajícího procesu.
- lpCurrentDirectory
- Ukazatel na řetězec , který specifikuje počáteční (startovací) adresář. Tento adresář musí obsahovat disk. Pokud parametr není předán, pak nový proces použije startovací adresář volajícího procesu.
- lpStartupInfo
- Ukazatel na strukturu STARTUPINFO popisující jaká má být velikost, pozice atd. hlavního okna procesu.
- lpProcessInformation
- Ukazatel na strukturu PROCESS_INFORMATION, která po spuštění nového procesu obsahuje jeho identifikaci.
- Vrací:
- Pokud se funkce ukončí korektně, pak vrací číslo > 0.
Pokud se funkce neukončí korektně, pak vrací 0. Upřesňující kód chyby lze zjistit pomocí API funkce GetLastError().
- Příklad:
LOCAL loSI,loPI,lcSI,lcPI,lcProgram,liExitCode
* Deklarace API funkcí
=LoadDllFunc("DECLARE INTEGER CreateProcess IN kernel32.DLL STRING, STRING, INTEGER, INTEGER, INTEGER, INTEGER, INTEGER, STRING @, STRING @, STRING @")
=LoadDllFunc("DECLARE INTEGER SetLastError IN kernel32 Integer fdwError")
=LoadDllFunc("DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject")
=LoadDllFunc("DECLARE INTEGER WaitForSingleObject IN kernel32.DLL INTEGER hHandle, INTEGER dwMilliseconds")
*=LoadDllFunc("DECLARE Sleep IN kernel32 integer")
*=LoadDllFunc("DECLARE INTEGER GetExitCodeProcess IN kernel32 INTEGER ,INTEGER @")
* Vytvoř objekt pro ovlivnění hlavního okna aplikace
loSI=CREATEOBJECT("_struc_STARTUPINFO")
* Vytvoř objekt pro navrácení informací o spuštěném procesu
loPI=CREATEOBJECT("_struc_PROCESS_INFORMATION")
* Při spuštění procesu skryj hlavní okno aplikace
loSI.dwFlags=STARTF_USESHOWWINDOW
loSI.wShowWindow=SW_HIDE
* Vytvoř C++ strukturu z VFP objektu
lcSI=loSI.CreateString()
lcPI=loPI.CreateString()
lcProgram = "Muj.exe param1 param2" + CHR(0)
=SetLastError(0)
IF CreateProcess(.NULL., lcProgram, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, (GetTempPathEx()+CHR(0)), @lcSI, @lcPI)<>0
* Výborně neselhalo to
* Načti zpět informace o spuštěném procesu z řetězce do vlastností tříd.
loPI.ReadString(@lcPI)
* Čekej, dokud proces běží
DO WHILE WaitForSingleObject(loPI.hProcess, 250 ) = WAIT_TIMEOUT
ENDDO
* Čekej, dokud proces běží (použití funkce GetExitCodeProcess())
liExitCode=STILL_ACTIVE
DO WHILE liExitCode=STILL_ACTIVE
=Sleep(500)
=GetExitCodeProcess(loPI.hProcess,@liExitCode )
ENDDO
=CloseHandle(loPI.hProcess) && Uzavři handle
ENDIF
|