StarsLikeDust Posted March 11, 2010 Posted March 11, 2010 Hi All, I'm a bit of a noob to Autoit. What I am trying to do is write a script to close a program. The program in question runs as a service. Since it's a database for the bookstore I work at it when you tell it to close it pops up a dialogue box telling you it will take 10 mins. Here is the code I have so far. expandcollapse popupWhile ProcessExists( "ACUMEN BOOK Server.exe" ) > 0 if WinExists ( "4D Server" ) == 1 Then WaitClose() EndIf If WinExists ( "ACUMEN Book" ) == 1 Then Close3() EndIf If WinExists ( "ACUMEN Book" ) == 1 Then Close2() EndIf If WinExists ( "ACUMEN Book" ) == 1 Then Close1() EndIf WEnd ;Reboot the computer Shutdown ( 2, "Weekly Reboot" ) Exit ;Functions ;Looks for Acumen Book window and send Ctrl+Q to try and shut it down Func Close1() WinActivate ( "ACUMEN Book" ) WinWaitActive( "ACUMEN Book" ) SendKeepActive ( "ACUMEN Book","{CTRLDOWN}q{CTRLUP}" ) return 0 EndFunc ;Looks for Acumen Book window and sends the close signal Func Close2() WinActivate ( "ACUMEN Book" ) if WinActive ( "4D Server" ) Then WinClose ( "ACUMEN Book" ) EndIf return 0 EndFunc ;Looks for Acumen Book window and send Ctrl+Q to try and shut it down Func Close3() WinActivate ( "ACUMEN Book" ) if WinActive ( "4D Server" ) Then SendKeepActive ( "ACUMEN Book","^q" ) EndIf return 0 EndFunc ;looks for the dialogue associated with closing acumen book server and tells it to continue Func WaitClose() WinActivate ( "4D Server" ) if WinActive ( "4D Server" ) Then SendKeepActive ( "{Enter}" ) EndIf return 0 EndFunc Nothing terribly complicated but unfortunately I simply doesn't work. I did a bit of digging around and found that when I use WinGetState( "ACUMEN Book" ) it returns 15 the help files say it should be 16,8, 4, etc. so I'm guessing that might be the issue? Anyone know how to get around that? Note: ProcessClose does shut it down but not properly. Since it is a database I'd rather shut it down the way it expects to be shutdown.
PsaltyDS Posted March 11, 2010 Posted March 11, 2010 (edited) Run this from a commandline: NET START Look for the service name in the list (i.e. "ACUMEN Book Server"). Then run this from AutoIt: $sSvcName = 'ACUMEN Book Server' $iRET = RunWait('NET.exe STOP "' & $sSvcName & '"') MsgBox(64, 'Done', '$iRET = ' & $iRET) There is also a WMI interface via the Win32_Service object, and DllCalls() you can use, but this is the basic method. Edited March 11, 2010 by PsaltyDS Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
Fulano Posted March 11, 2010 Posted March 11, 2010 Well, I don't really have time to examine it atm, but I can explain the 15 return value. The values are actually binary flags. so 000001 = 1 000010 = 2 000100 = 4 001000 = 8 010000 = 16 100000 = 32 and added together they can indicate multiple states, in your case 001111 = 15 which, if you follow your eyes up to the table above, means that your window has traits 1, 2, 4 & 8 or in other words it exists, is visible, is enabled, and is active Hope this helps with the debugging #fgpkerw4kcmnq2mns1ax7ilndopen (Q, $0); while ($l = <Q>){if ($l =~ m/^#.*/){$l =~ tr/a-z1-9#/Huh, Junketeer's Alternate Pro Ace /; print $l;}}close (Q);[code] tag ninja!
StarsLikeDust Posted March 15, 2010 Author Posted March 15, 2010 Hi Folks thanks for the idea and explination. Unfortuantly I don't think that is quite what I am looking for. NET Stop does indeed shut down the server however it seems to do so abruptly. Here is the command I was using for it: Run ( @ComSpec & " /c" & 'NET Stop "4d: Server: ACUMEN_Struc_v7_6_66"', "", @SW_HIDE) 4d: Server: ACUMEN_Struc_v7_6_66 was found by following your suggestion Salty. Any other ideas? Or any idea why a simple WinClose on the window name of the program wouldn't work?
PsaltyDS Posted March 16, 2010 Posted March 16, 2010 I don't understand why a normal STOP is undesirable. Either by NET STOP, or WMI with $oSvc.StopService, it's the service's responsibility to respond correctly to that method. What's the normal method of shutting this app down? Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
StarsLikeDust Posted March 19, 2010 Author Posted March 19, 2010 I don't understand why a normal STOP is undesirable. Either by NET STOP, or WMI with $oSvc.StopService, it's the service's responsibility to respond correctly to that method. What's the normal method of shutting this app down?Sigh, sorry about the time between posts I am working on this in my spare time. Basically the reason Net Stop is undesierable is that this software is rubbish. The reason I want it to shutdown is that the vendor told the folks here that the server this software runs on should be rebooted once a week. I didn't belive it at first and let the whole thing run for a couple weeks once. It does indeed start doing weird stuff. Since it's the method that the bookstore useses to keep track of sales and inventory I do want it to shutdown normally. The way we currently have to shut it down is this:It runs as a service but we still have to login to the server and interact with the GUI for this thing. Ctrl + Q (or the file menu) brings up a dialogue box that also needs interacted with. (I know this place should get new software but i think it's unlikely they actually will...)
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