2011-01-31 28 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。不過,我不記得爲什麼要這樣做的確切原因。