File "RunCmd.inc"

Path: /ShuffleGUI/inc/RunCmd.inc
File size: 3.27 KB
MIME-type:
Charset: utf-8

'------------------------------------------------------------------------------
FUNCTION Execute (Program AS STRING, Arguments AS STRING, nShow AS LONG) AS DWORD
'   Advanced Shell. Example of how to use :
'   Local PID As Dword
'   PID = Execute( Environ$("COMSPEC"), "/C dir " & $Dq & folderName & $Dq & " /ad /s /b > tmp.txt", 0 )
'   WaitForSingleObject PID, %INFINITE    ' activate this line if you want synchronous shell
'   CloseHandle PID
    LOCAL ShellInfo AS SHELLEXECUTEINFO
    ShellInfo.cbSize = SIZEOF(ShellInfo)
    ShellInfo.fMask = %SEE_MASK_FLAG_NO_UI OR %SEE_MASK_NOCLOSEPROCESS
    ShellInfo.lpFile = STRPTR(Program)
    ShellInfo.lpParameters = STRPTR(Arguments)
    ShellInfo.nShow = nShow
    IF ShellExecuteEx(ShellInfo) THEN FUNCTION = ShellInfo.hProcess
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
SUB WaitForThread(BYREF TID AS DWORD) ' deadline in second
    LOCAL lRes AS LONG
    DO ' Wait for the thread to finish
        DIALOG DOEVENTS
        SLEEP 0
        lRes = WaitForSingleObject(TID, 100)
    LOOP UNTIL lRes <> %WAIT_TIMEOUT
    KillThread TID
END SUB
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
SUB KillThread(BYREF TID AS DWORD)
    LOCAL lRes AS LONG
    THREAD SUSPEND TID TO lRes
    CloseHandle TID
    THREAD CLOSE TID TO lRes
    TID = 0
END SUB
'------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
FUNCTION RUN_CMD(BYVAL cmdLine AS STRING, OPTIONAL BYVAL folder AS STRING) AS LONG
    LOCAL rep AS STRING
    LOCAL ff AS LONG
    LOCAL PID AS DWORD

    IF folder <> "" THEN rep = folder ELSE rep = ENVIRON$("TEMP") + "\"
    rep = RTRIM$(rep, "\") + "\"

    ff = FREEFILE
    OPEN rep + "temp.bat" FOR OUTPUT AS #ff
        PRINT #ff, "@echo off"
        PRINT #ff, LEFT$(rep, 2)
        PRINT #ff, "cd " + $DQ + rep + $DQ
        PRINT #ff, cmdLine
    CLOSE

    PID = Execute(rep + "temp.bat", "", 0)
    WaitForThread PID ' Wait for the script to finish

    KILL rep + "temp.bat"
END FUNCTION
'--------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
FUNCTION DUMP_CMD(BYVAL cmdLine AS STRING, OPTIONAL BYVAL folder AS STRING) AS STRING
    LOCAL rep, e AS STRING
    LOCAL ff AS LONG
    LOCAL PID AS DWORD

    IF folder <> "" THEN rep = folder ELSE rep = ENVIRON$("TEMP") + "\"
    rep = RTRIM$(rep, "\") + "\"

    ff = FREEFILE
    OPEN rep + "temp.bat" FOR OUTPUT AS #ff
        PRINT #ff, "@echo off"
        PRINT #ff, LEFT$(rep, 2)
        PRINT #ff, "cd " + $DQ + rep + $DQ
        PRINT #ff, cmdLine + " > dump.txt 2>&1"
    CLOSE

    PID = Execute(rep + "temp.bat", "", 0)
    WaitForThread PID ' Wait for the script to finish

    KILL rep + "temp.bat"

    ff = FREEFILE
    OPEN rep + "dump.txt" FOR BINARY AS #ff
        GET$ #ff, LOF(#ff), e
    CLOSE

    KILL rep + "dump.txt"
    FUNCTION = RTRIM$(e, ANY $CRLF)
END FUNCTION
'--------------------------------------------------------------------------------