| icCommandLine | input | character | The command line for the process that needs to be started. |
| icCurrentDirectory | input | character | The working directory (= the directory in which the process needs te be started) |
| iiShowWindow | input | integer | Show window. 1 = normal 2 = maximized 3 = minimized |
| iiWaitBeforeCheck | input | integer | The number of seconds the system needs to wait before checking whether the process is still "alive". |
SET-SIZE (vmStartupInfo) = 68.
PUT-LONG (vmStartupInfo, 1) = 68. /* DWORD cb - size */
PUT-LONG (vmStartupInfo, 45) = 1. /* STARTF_USESHOWWINDOW */
PUT-SHORT (vmStartupInfo, 49) = iiShowWindow. /* WORD wShowWindow */
SET-SIZE (vmProcessInformation) = 16.
IF icCurrentDirectory <> "":U
THEN DO:
SET-SIZE (vmCurrentDirectory) = 256.
PUT-STRING (vmCurrentDirectory, 1) = icCurrentDirectory.
END.
&message UTF-8: convert string to WCHAR & use 'CreateProcessW'
RUN CreateProcessA (INPUT 0,
INPUT icCommandLine,
INPUT 0,
INPUT 0,
INPUT 0,
INPUT 0,
INPUT 0,
INPUT IF icCurrentDirectory = "":U
THEN 0
ELSE GET-POINTER-VALUE (vmCurrentDirectory),
INPUT GET-POINTER-VALUE (vmStartupInfo),
INPUT GET-POINTER-VALUE (vmProcessInformation),
OUTPUT viResult).
ASSIGN viProcess = GET-LONG (vmProcessInformation, 1)
viThread = GET-LONG (vmProcessInformation, 5)
viProcessId = GET-LONG (vmProcessInformation, 9).
RUN CloseHandle (INPUT viThread,
OUTPUT viResult).
SET-SIZE (vmStartupInfo) = 0.
SET-SIZE (vmProcessInformation) = 0.
IF icCurrentDirectory <> "":U
THEN SET-SIZE (vmCurrentDirectory) = 0.
/* =========================================================================== */
/* Wait some seconds, before checking whether the process is still alive. */
/* =========================================================================== */
pause iiWaitBeforeCheck no-message.
run WaitForSingleObject (INPUT viProcess,
INPUT 250,
OUTPUT viResult).
/* if the viResult = 258, the process is still running/active, if it is 0, then it is not active anymore */
if viResult = 0
then assign viProcessId = 0.
RUN CloseHandle (INPUT viProcess,
OUTPUT viResult).
RETURN viProcessId.