Verificați dacă procesul Office este disponibil în cazul utilizării Office Automation

Există o modalitate de a verifica dacă un proces Microsoft Office (adică Word, Excel) a fost atârnat atunci când utilizați Office Automation? În plus, dacă procesul este atârnat, există o modalitate de ao termina?

0
fr hi bn

3 răspunsuri

Permiteți-mi să încep prin a spune că nu recomand să faceți acest lucru într-un serviciu pe un server, dar voi face tot posibilul pentru a răspunde la întrebări.

Rularea ca serviciu face dificilă curățarea. De exemplu, cu ceea ce executați ca un serviciu supraviețuiți uciderii unui cuvânt spânzurat sau excelați. S-ar putea să fiți în situația de a ucide serviciul. Se va opri serviciul dacă cuvântul sau Excel este în această stare.

O problemă în încercarea de a testa dacă este atârnată este că testul dvs. ar putea cauza o nouă instanță de cuvânt la pornire și la lucru, în timp ce serviciul pe care rulează serviciul ar fi încă atârnat.

Cea mai bună modalitate de a determina dacă este atârnată este să-i ceri să facă ceea ce ar trebui să facă și să verifice rezultatele. Aș fi nevoie să aflu mai multe despre ceea ce face de fapt.

Iată câteva comenzi de utilizat într-un fișier batch pentru curățare (ambele ar trebui să fie în cale):

  • sc stop nume de serviciu - oprește serviciul numit nume de serviciu
  • numele de pornire al serviciului sc - începe serviciul numit nume de serviciu
  • numele serviciului de interogare sc - Solicită starea serviciului

  • taskkill/F/IM excel.exe - termină toate instanțele excel.exe

0
adăugat

Îmi amintesc că am făcut acest lucru acum câțiva ani - deci vorbesc Office XP sau 2003 de zile, nu 2007.

Evident, o soluție mai bună pentru automatizare în aceste zile este utilizarea noului format xml care descrie docx etc folosind spațiul de nume System.IO.Packaging.

Apoi, obișnuiau să observ că ori de câte ori MSWord lovise găleata și se destrămase, pe mașină rula un proces numit "Dr. Watson". Acesta a fost primul meu indiciu că Cuvântul sa împiedicat și a căzut. Uneori aș putea vedea mai mult de un WINWORD.EXE , dar codul meu tocmai a folosit scanarea pentru bunul doctor. Odată ce am văzut că (în cod), am ucis toate WINWORD.EXE procesează bunul Doctor însuși și am reluat procesul de tortură a Cuvântului :-)

Sper că vă oferă unele indicii cu privire la ce să căutați.

Toate cele bune,

Rob G

P.S. S-ar putea chiar să găsesc codul în arhivele mele dacă nu veniți bine!

0
adăugat

Pot răspunde în a doua jumătate; dacă aveți o referință la obiectul aplicației din codul dvs., puteți să-l numiți "Quit" pe el:

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

Pentru a verifica un proces spânzurat, cred că doriți să încercați să obțineți date din aplicație și să vedeți dacă obțineți rezultate într-un interval de timp rezonabil (verificați într-un cronometru sau alt thread sau ceva similar). Probabil că există o cale mai bună.

0
adăugat