138 lines
3.8 KiB
Plaintext
138 lines
3.8 KiB
Plaintext
FUNCTION Createprocess(lcExe,lcCommandLine,lnShowWindow,llWaitForCompletion)
|
|
LOCAL hProcess, cProcessInfo, cStartupInfo
|
|
|
|
DECLARE INTEGER CreateProcess IN kernel32 as _CreateProcess;
|
|
STRING lpApplicationName,;
|
|
STRING lpCommandLine,;
|
|
INTEGER lpProcessAttributes,;
|
|
INTEGER lpThreadAttributes,;
|
|
INTEGER bInheritHandles,;
|
|
INTEGER dwCreationFlags,;
|
|
INTEGER lpEnvironment,;
|
|
STRING lpCurrentDirectory,;
|
|
STRING lpStartupInfo,;
|
|
STRING @ lpProcessInformation
|
|
|
|
cProcessinfo = REPLICATE(CHR(0),128)
|
|
cStartupInfo = GetStartupInfo(lnShowWindow)
|
|
|
|
|
|
|
|
IF !EMPTY(lcCommandLine)
|
|
lcCommandLine = ["] + lcExe + [" ]+ lcCommandLine
|
|
ELSE
|
|
lcCommandLine = ""
|
|
ENDIF
|
|
lnResult = _CreateProcess(lcExe,lcCommandLine,0,0,1,0,0,;
|
|
SYS(5)+CURDIR(),cStartupInfo,@cProcessInfo)
|
|
lhProcess = CHARTOBIN( SUBSTR(cProcessInfo,1,4) )
|
|
IF llWaitForCompletion
|
|
#DEFINE WAIT_TIMEOUT 0x00000102
|
|
DECLARE INTEGER WaitForSingleObject IN kernel32.DLL ;
|
|
INTEGER hHandle, INTEGER dwMilliseconds
|
|
DO WHILE .T.
|
|
*** Update every 100 milliseconds
|
|
IF WaitForSingleObject(lhProcess, 100) != WAIT_TIMEOUT
|
|
EXIT
|
|
ELSE
|
|
DOEVENTS
|
|
ENDIF
|
|
ENDDO
|
|
ENDIF
|
|
|
|
DECLARE INTEGER CloseHandle IN kernel32.DLL ;
|
|
INTEGER hObject
|
|
CloseHandle(lhProcess)
|
|
RETURN IIF(lnResult=1,.t.,.f.)
|
|
ENDFUNC
|
|
|
|
|
|
|
|
|
|
FUNCTION getStartupInfo(lnShowWindow)
|
|
LOCAL lnFlags
|
|
* creates the STARTUP structure to specify main window
|
|
* properties if a new window is created for a new process
|
|
IF EMPTY(lnShowWindow)
|
|
lnShowWindow = 1
|
|
ENDIF
|
|
*| typedef struct _STARTUPINFO {
|
|
*| DWORD cb; 4
|
|
*| LPTSTR lpReserved; 4
|
|
*| LPTSTR lpDesktop; 4
|
|
*| LPTSTR lpTitle; 4
|
|
*| DWORD dwX; 4
|
|
*| DWORD dwY; 4
|
|
*| DWORD dwXSize; 4
|
|
*| DWORD dwYSize; 4
|
|
*| DWORD dwXCountChars; 4
|
|
*| DWORD dwYCountChars; 4
|
|
*| DWORD dwFillAttribute; 4
|
|
*| DWORD dwFlags; 4
|
|
*| WORD wShowWindow; 2
|
|
*| WORD cbReserved2; 2
|
|
*| LPBYTE lpReserved2; 4
|
|
*| HANDLE hStdInput; 4
|
|
*| HANDLE hStdOutput; 4
|
|
*| HANDLE hStdError; 4
|
|
*| } STARTUPINFO, *LPSTARTUPINFO; total: 68 bytes
|
|
|
|
|
|
#DEFINE STARTF_USESTDHANDLES 0x0100
|
|
#DEFINE STARTF_USESHOWWINDOW 1
|
|
#DEFINE SW_HIDE 0
|
|
#DEFINE SW_SHOWMAXIMIZED 3
|
|
#DEFINE SW_SHOWNORMAL 1
|
|
lnFlags = STARTF_USESHOWWINDOW
|
|
RETURN binToChar(80) +;
|
|
binToChar(0) + binToChar(0) + binToChar(0) +;
|
|
binToChar(0) + binToChar(0) + binToChar(0) + binToChar(0) +;
|
|
binToChar(0) + binToChar(0) + binToChar(0) +;
|
|
binToChar(lnFlags) +;
|
|
binToWordChar(lnShowWindow) +;
|
|
binToWordChar(0) + binToChar(0) +;
|
|
binToChar(0) + binToChar(0) + binToChar(0) + REPLICATE(CHR(0),30)
|
|
ENDFUNC
|
|
|
|
|
|
|
|
FUNCTION CharToBin(lcBinString,llSigned)
|
|
LOCAL m.i, lnWord
|
|
lnWord = 0
|
|
FOR m.i = 1 TO LEN(lcBinString)
|
|
lnWord = lnWord + (ASC(SUBSTR(lcBinString, m.i, 1)) * (2 ^ (8 * (m.i - 1))))
|
|
ENDFOR
|
|
|
|
IF llSigned AND lnWord > 0x80000000
|
|
lnWord = lnWord - 1 - 0xFFFFFFFF
|
|
ENDIF
|
|
RETURN lnWord
|
|
* wwAPI :: CharToBin
|
|
ENDFUNC
|
|
|
|
************************************************************************
|
|
FUNCTION BinToChar(lnValue)
|
|
****************************************
|
|
Local byte(4)
|
|
If lnValue < 0
|
|
lnValue = lnValue + 4294967296
|
|
EndIf
|
|
byte(1) = lnValue % 256
|
|
byte(2) = BitRShift(lnValue, 8) % 256
|
|
byte(3) = BitRShift(lnValue, 16) % 256
|
|
byte(4) = BitRShift(lnValue, 24) % 256
|
|
RETURN Chr(byte(1))+Chr(byte(2))+Chr(byte(3))+Chr(byte(4))
|
|
* wwAPI :: BinToChar
|
|
ENDFUNC
|
|
|
|
************************************************************************
|
|
FUNCTION BinToWordChar(lnValue)
|
|
****************************************
|
|
*** Function: Creates a DWORD value from a number
|
|
*** Pass: lnValue - VFP numeric integer (unsigned)
|
|
*** Return: binary string
|
|
************************************************************************
|
|
RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
|
|
ENDFUNC
|
|
|