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

时间:2011-01-31 14:39:32

标签: c++ excel com automation

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

  • 通过向 CreateProcess
  • 提供所需的可执行文件来启动Excel
  • 使用 EnumWindows EnumChildWindows 找到主窗口和可访问窗口
  • 使用 AccessibleObjectFromWindow 从Excel对象模型中获取对象
  • 通过COM智能指针进行自动化操作

这一切都运行正常,但在 ExcelApplication 对象上调用 Quit 后,Excel进程不会终止。与Word相同的设置按预期工作,并且该过程终止。任何关于Excel为什么表现不同的想法都会非常感激。

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

/* 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();

1 个答案:

答案 0 :(得分:-1)

Microsoft不再支持您正在做的事情:http://support.microsoft.com/kb/257757(它讨论服务器端代码,但它引用任何非交互式解决方案,无论架构如何)。

尽管如此,我相信我在一段时间内在某些.Net代码中遇到了类似的问题,解决方案是在完成后强行杀死Excel。我不记得为什么必须这样做的确切原因。