簡體   English   中英

Embarcadero C ++構建器Excel Automation C ++不會退出

[英]Embarcadero C++ builder Excel Automation C++ does not quit

我正在嘗試使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 Automation,但我希望能找到解決方法。 我也知道您可以

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

這完全殺死了Excel,但我擔心該應用程序的未來,因為它會生成大量的excel應用程序,在這種情況下,我將不得不單獨殺死Excel,並且從那里變得一團糟。

任何幫助將非常感激!

解決了!

因此,我終於想出了一種方法來殺死在后台運行的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);
    }
}

希望這對正在尋找解決方案的其他人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM