【问题标题】:Embarcadero C++ builder Excel Automation C++ does not quitEmbarcadero C++ builder Excel Automation C++ 不退出
【发布时间】:2012-07-29 09:13:03
【问题描述】:

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

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 吗?

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

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

这完全杀死了 Excel,但我担心该应用程序的未来会生成相当多的 Excel 应用程序,在这种情况下,我将不得不单独杀死 Excel,这一切都会从那里变得一团糟......

任何帮助将不胜感激!

【问题讨论】:

  • pXL、pXLWSs 和 PXLWS 有哪些数据类型?
  • 另外,检查stackoverflow.com/q/4852135/25507 看看这是否适用于您的情况。
  • 它们是 COM 接口。 TComInterface<:_application>pXL;
  • 我以前也去过那个页面
  • @JoshKelley - 所以你有没有听说过或看到什么新的东西,因为我没有,我仍然有这个问题......

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


【解决方案1】:

解决了!

所以我终于想出了一个方法来杀死后台运行的 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);
    }
}

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

【讨论】:

  • 顺便说一句,pXL 是我用于 Excel 的包装器的应用程序指针...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-27
  • 2018-05-16
  • 2014-07-13
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
相关资源
最近更新 更多