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