COM自动化后,Excel进程不会退出

我需要自动化一个特定版本的Excel(2003),与目标机器上安装的默认版本无关。 为此,我使用以下步骤:

  • 通过向CreateProcess提供所需的可执行文件来启动Excel
  • 使用EnumWindowsEnumChildWindowsfind主窗口
  • 使用AccessibleObjectFromWindow从Excel对象模型中获取对象
  • 通过COM智能指针做自动化的东西

这一切工作正常,但Excel进程不会终止后, ExcelApplication对象上退出 。 与Word相同的设置按预期工作,并且该过程终止。 任何关于为什么Excel行为不同的想法将不胜感激。

从.NET中自动化Excel时,我已经阅读了类似的问题,其中悬挂COM引用是原因。 但是,如果这也是我的C ++情况的原因,我不明白为什么。 即使除了退出 ,我什么都不做,这个过程依然存在:

/* create process, get handle to accessible Excel window */ Excel11::_ApplicationPtr excelApplication; try { Excel11::WindowPtr::Interface* pInterface; if ( ::AccessibleObjectFromWindow( hwndExcelAccessible, OBJID_NATIVEOM, IID_IDispatch, reinterpret_cast< void** >( &pInterface ) ) == S_OK ) { excelApplication = pInterface->Application; pInterface->Release(); } } catch ( _com_error& e ) { /* omitted */ } excelApplication->Quit(); 

微软不再支持你正在做的事情: http : //support.microsoft.com/kb/257757 (它涉及服务器端代码,但它引用了任何非交互式解决scheme,而不pipe体系结构如何)。

尽pipe如此,我相信我在一些.Net代码中遇到了一个类似的问题,而解决办法是强行杀死Excel。 但我不记得为什么要这样做的确切原因。