Sign in to follow this  
Followers 0
gil900

How this code work?

4 posts in this topic

#1 ·  Posted (edited)

Helo,

I have this function that I wrote some time ago:

Func _RetrieveRunningServices2($Sort = 0)
    Local $Output[1][2], $iPid
    $Output[0][0] = 0
    $iPid = Run(@ComSpec & " /c sc query", @SystemDir, @SW_HIDE, 2)
    If $iPid > 0 Then
        ProcessWaitClose($iPid)
        ; from here the Process $iPid Should be closed
        Sleep(10000) ; just to be sure that the process is really closeed..
        If ProcessExists($iPid) Then ConsoleWrite(1 &" (Line "&@ScriptLineNumber&")"&@CRLF) ; And this line confirms that the process really close
        Local $StdoutRead = StdoutRead($iPid) ; So how this line works if $iPid is closed ?? ther is not @error
        If Not @error Then
            Local $add = 0, $n = 1, $aStdoutRead, $tmp
            $aStdoutRead = StringSplit($StdoutRead, @CRLF, 1)
            For $a = 1 To $aStdoutRead[0]
                $tmp = StringLeft($aStdoutRead[$a], 1)
                If $tmp <> " " And $tmp <> "" Then
                    $tmp = StringSplit($aStdoutRead[$a], ": ", 1)
                    If $tmp[0] = 2 Then
                        If $add = 0 Then
                            ReDim $Output[$n + 1][2]
                            $Output[$n][0] = $tmp[$tmp[0]]
                            $add = 1
                        Else
                            $Output[$n][1] = $tmp[$tmp[0]]
                            $Output[0][0] = $n
                            $n += 1
                            $add = 0
                        EndIf
                    EndIf
                EndIf
            Next
            If $Sort = 1 And $Output[0][0] > 0 Then _ArraySort($Output, 0, 1, 0, 1) ; Sort by DisplayName
        EndIf
    EndIf
    ;$Output[0][0]
    Return $Output
EndFunc   ;==>_RetrieveRunningServices2

My question is in the code:

ProcessWaitClose($iPid)
; from here the Process $iPid Should be closed
Sleep(10000) ; just to be sure that the process is really closeed..
If ProcessExists($iPid) Then ConsoleWrite(1 &" (Line "&@ScriptLineNumber&")"&@CRLF) ; And this line confirms that the process really close
Local $StdoutRead = StdoutRead($iPid) ; So how this line works if $iPid is closed ?? ther is not @error
If Not @error Then

Thanks for helpers!

Edited by gil900

Share this post


Link to post
Share on other sites



Search about flushing the standard input stream.


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

I had the same perplexity as exposed in >this post and also >here time ago.
in any case it seems that the way to read the StdOut stream from an already death process

is also used in the official help of AutoIt, as from the example of the StdOutRead command...  :huh2:


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

I had the same perplexity as exposed in >this post and also ?do=embed' frameborder='0' data-embedContent>>here time ago.

in any case it seems that the way to read the StdOut stream from an already death process

is also used in the official help of AutoIt, as from the example of the StdOutRead command...  :huh2:

 
Thanks for the information.

I had a feeling that it could cause problems and you gave evidence.

I will use this ?do=embed' frameborder='0' data-embedContent>>piece of code instead ProcessWaitClose($iPid)

:)
 
I Still did not understand how it can read information from dead process.
 
EDIT:
New function with the fix for this potential bug/problem:
Func _RetrieveRunningServices2($Sort = 0)
    Local $Output[1][2], $iPid
    $Output[0][0] = 0
    $iPid = Run(@ComSpec & " /c sc query", @SystemDir, @SW_HIDE, 2)
    If $iPid <= 0 Then Return $Output
    Local $StdoutRead,$tmp = TimerInit()
    Do
        If TimerDiff($tmp) > 15000 Then Return $Output ; just a fix for another potential bug/problem that the loop will never ends ..
        $StdoutRead &= StdoutRead($iPid)
    Until @error
    Local $add = 0, $n = 1, _
    $aStdoutRead = StringSplit($StdoutRead, @CRLF, 1)
    For $a = 1 To $aStdoutRead[0]
        $tmp = StringLeft($aStdoutRead[$a], 1)
        If StringStripWS($tmp,3) = '' Then ContinueLoop
        $tmp = StringSplit($aStdoutRead[$a], ": ", 1)
        If $tmp[0] <> 2 Then ContinueLoop
        If $add = 0 Then
            ReDim $Output[$n + 1][2]
            $Output[$n][0] = $tmp[$tmp[0]]
            $add = 1
        Else
            $Output[$n][1] = $tmp[$tmp[0]]
            $Output[0][0] = $n
            $n += 1
            $add = 0
        EndIf
    Next
    If $Sort And $Output[0][0] > 1 Then _ArraySort($Output, 0, 1, 0, 1) ; Sort by DisplayName
    Return $Output
EndFunc   ;==>_RetrieveRunningServices2

EDIT: The code has been updated with a fix for another potential bug/problem that the loop will never ends ..

Edited by gil900

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0