c++ - COM 自动化后 Excel 进程不会退出

标签 c++ excel com automation

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

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

一切正常,但在 ExcelApplication 对象上调用 Quit 后,Excel 进程不会终止。与 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();

最佳答案

Microsoft 不再支持您的操作:http://support.microsoft.com/kb/257757 (它谈论的是服务器端代码,但它引用了任何非交互式解决方案,而不考虑体系结构)。

尽管如此,我相信我不久前在某些 .Net 代码中遇到了类似的问题,解决方案是在完成 Excel 后强行终止它。不过,我不记得必须这样做的确切原因。

关于c++ - COM 自动化后 Excel 进程不会退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4852135/

相关文章:

c# - 带指针的 PInvoke - C++ 到 C#

c++ - 自修改代码与编译器优化与重复代码

c++ - "points to uninitialised byte(s)"Valgrind 错误

PHP计算函数

c# - COM 接口(interface) Photoshop 兼容性问题

java - java中的Docx到PDF转换

c++ - 如何修复 C++ 中的 'Heap has been corrupted ' 错误?

c++ - 什么更快?

java - 使用java和apache POI读取Excel中的数据

excel - 查找列然后过滤