views:

491

answers:

4

Is there a way to check to see if an Microsoft Office process (i.e. Word, Excel) has hung when using Office Automation? Additionally, if the process is hung, is there a way to terminate it?

A: 

I can answer the latter half; if you have a reference to the application object in your code, you can simply call "Quit" on it:

private Microsoft.Office.Interop.Excel.Application _excel;
// ... do some stuff ...
_excel.Quit();

For checking for a hung process, I'd guess you'd want to try to get some data from the application and see if you get results in a reasonable time frame (check in a timer or other thread or something). There's probably a better way though.

Ed Schwehm
+1  A: 

Hi Rob,

I remember doing this a few years ago - so I'm talking Office XP or 2003 days, not 2007.

Obviously a better solution for automation these days is to use the new XML format that describes docx etc using the System.IO.Packaging namespace.

Back then, I used to notice that whenever MSWord had kicked the bucket and had had enough, a process called "Dr. Watson" was running on the machine. This was my first clue that Word had tripped and fallen over. Sometimes I might see more than one WINWORD.EXE, but my code just used to scan for the good Doctor. Once I saw that (in code), I killed all WINWORD.EXE processes the good Doctor himself, and restarted the process of torturing Word :-)

Hope that gives you some clues as to what to look for.

All the best,

Rob G

P.S. I might even be able to dig out the code in my archives if you don't come right!

RobertTheGrey
A: 

@Rob - As it turns out, this particular application is making use of Office XP so this is all very relevant advice. Now, one problem with this particular application is that it is actually running as a service (bad) on a server (worse). The long term goal is to convert it all over to Office XML so that all of these issues can be avoided, but in the mean time we need to make sure that it keeps working most of the time.

The server it is running on is a Windows 2003 box and I'm not sure if I have seen Dr. Watson kick off on the server before. Do you know of any other ways to check to see if the processes has hung?

Rob
+2  A: 

Let me start off saying that I don't recommend doing this in a service on a server, but I'll do my best to answer the questions.

Running as a service makes it difficult to clean up. For example with what you have running as a service survive killing a hung word or excel. You may be in a position to have to kill the service. Will your service stop if word or excel is in this state.

One problem with trying to test if it is hung, is that your test could cause a new instance of word to startup and work, while the one that the service is running would still be hung.

The best way to determine if it's hung is to ask it to do what it is supposed to be doing and check for the results. I would need to know more about what it is actually doing.

Here are some commands to use in a batch file for cleaning up (both should be in the path):

  • sc stop servicename - stops service named servicename
  • sc start servicename - starts service named servicename
  • sc query servicename - Queries the status of servicename

  • taskkill /F /IM excel.exe - terminates all instances of excel.exe

bruceatk