2011-01-31 80 views
1

我需要自动化特定版本的Excel(2003),与目标机器上安装的默认版本无关。为此,我使用以下步骤:Excel进程在COM自动化后不会退出

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

这一切工作正常,但一个电话ExcelApplication对象退出后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(); 
+0

你是否放弃了COM智能指针? – 2011-01-31 14:43:46

回答

-1

你在做什么,不再支持通过Microsoft:http://support.microsoft.com/kb/257757(它谈论的服务器端的代码,但它引用任何非交互式解决方案而不管架构)。

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