2012-07-31 69 views
0

我试图自动化Excel,以便它在服务器上生成报告,然后在请求时通过电子邮件将此报告发送给用户。我遇到的问题是,一旦我创建了一个excel文档并将数据写入其中,程序即使在发出pXL-> Quit()后也不会退出。命令。 这就是我的“关闭”指令擅长:Embarcadero C++构建器Excel自动化C++不会退出

pXL->Workbooks->Close(LCID(LOCALE_USER_DEFAULT)); 
pXLWSs.Reset(); //Releases Worksheets 
pXLWS.Reset();//Releases Workbooks 
pXL->Quit();// "Quits" Excel ---> This does not quit excel 
pXL.Reset();//Release Excel application? 
CoUninitialize();//Uninitialise COMS 

我看了好几篇文章和博客关于这个具体问题,似乎这是因为我不释放与Excel相关联的所有COMS。所以我尝试了几次不初始化COMS。我发出了

CoUninitialize(); 

4次,这工作!但令我感到失望的是,它一直无法工作。

有谁知道如何优雅地关闭Excel?

我知道微软不支持服务器端Excel自动化,但我希望找到解决办法。 我也知道,你可以简单地

WinExec("taskkill /F /IM \"excel.exe\"",0); 

其完全杀死的Excel,但我很担心什么时候会产生相当数量的Excel应用程序的未来在这种情况下,我会杀了Excel的单独和它只是从那里得到凌乱....

任何帮助将不胜感激!

+0

pXL,pXLWSs和PXLWS的数据类型是什么? – 2012-07-31 15:03:08

+0

此外,请检查http://stackoverflow.com/q/4852135/25507,看看是否适用于您的情况。 – 2012-07-31 15:07:56

+0

它们是COM接口。 TComInterface PXL; – dRagonsRage 2012-07-31 15:09:10

回答

0

解决!

所以我终于想出了一种办法来杀掉在后台运行的Excel剩下的东西。

然后写入数据之后
GetWindowThreadProcessId((HWND)pXL->Hwnd, &ExcelprocessID); 

当其时杀应用程序:

当我创建Excel中,我使用存储其PID(进程标识符)

pXL->Workbooks->Close(LCID(LOCALE_USER_DEFAULT)); 
pXLWSs.Reset(); 
// Better to use "Reset", which will clear all references to this pointer 
// rather than "Release", which will only clear the last reference 
pXLWS.Reset(); 
pXL->Quit(); 
pXL.Reset(); 
CoUninitialize(); 

if (ExcelprocessID == 0) 
{ 
    ShowMessage("Could not find Excel ProcessID to close"); 
} 

else 
{ 
    HANDLE tmpHandle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, ExcelprocessID); 
    if (NULL != tmpHandle) 
    { 
     TerminateProcess(tmpHandle, 0); 
    } 
} 

希望这有助于任何人谁一直在寻找解决方案......

+0

btw,pXL是我用于Excel的包装的应用程序指针... – dRagonsRage 2012-08-30 09:46:14