![](/img/trans.png)
[英]Does AWS SDK for C++ work with Embarcadero C++ builder?
[英]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.