Embarcadero C ++构建器Excel Automation C ++不会退出

时间:2012-07-31 14:53:07

标签: c++ excel automation c++builder

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

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。所以我尝试了几次uninitialising COMS。我发了

CoUninitialize(); 

4次,这有效!但令我失望的是,它并不是一直有效。

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

我知道Microsoft不支持服务器端Excel Automation,但我希望找到一个解决方法。 我也知道你可以简单地

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

完全杀死了Excel,但我担心应用程序的未来会产生相当多的excel应用程序,在这种情况下,我必须单独杀死Excel,这一切都只是从那里变得混乱....

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

解决!

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

当我创建Excel时,我使用:

存储其PID(进程标识符)
GetWindowThreadProcessId((HWND)pXL->Hwnd, &ExcelprocessID);

然后在写入数据的时候杀死应用程序:

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);
    }
}

希望这可以帮助那些一直在寻找解决方案的人......