Guest Posted January 6, 2015 Share Posted January 6, 2015 (edited) Helo, I have this function that I wrote some time ago: expandcollapse popupFunc _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 January 6, 2015 by Guest Link to comment Share on other sites More sharing options...
guinness Posted January 6, 2015 Share Posted January 6, 2015 Search about flushing the standard input stream. UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _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 parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018 Link to comment Share on other sites More sharing options...
Gianni Posted January 6, 2015 Share Posted January 6, 2015 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... Chimp small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt.... Link to comment Share on other sites More sharing options...
Guest Posted January 6, 2015 Share Posted January 6, 2015 (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... 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 January 6, 2015 by Guest Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now