我有一些遗留代码,可以使用COM自动化和MSO dll从C ++程序启动Word(和其他应用程序)。它以非交互方式在服务器上运行。 有时应用程序会挂起并最终持续数天/周,服务器上的资源将被许多挂起的进程耗尽。
启动流程:
Word::_ApplicationPtr wordApp
HRESULT hr = wordApp.CreateInstance(__uuidof(Word::Application));
然后通过wordApp指针进行各种调用,其中一个指针可能会挂起。代码永远不会从调用返回,C ++代码也会停止。
检查这些挂起然后杀死Word有什么解决方案?
我考虑使用CreateProcess并使用waitforsingleobject超时但我无法通过自动化操作对象。
我无法找到一种方法来检索COM启动的应用程序的句柄,因此无法使用它来杀死它。
我想到了一个单独的线程并等待它然后在超时后杀死线程但是杀死一个线程并不释放所有资源,即word。
我想过要忘记所有活动过程并搜索“winword”然后杀死匹配的每个进程,但这看起来很混乱和黑客。
所以任何想法? 感谢。