大佬教程收集整理的这篇文章主要介绍了OLE 自动化 - 任务管理器中的 Ghost Excel 实例,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 wxautomationObject
将数据导出到 MS Excel。我创建了一些帮助类 ExcelApp、ExcelWorkbook 等......所有这些都继承自 wxautomationObject
。
简单来说,ExcelApp如下:
class ExcelApp :public wxautomationObject
{
public:
ExcelApp(WXIdisPATCH* dispatchPtr = null);
~ExcelApp() = default;
voID Quit();
std::unique_ptr<ExcelWorkbook> CreateWorkbook(bool Visible = truE);
std::vector<std::unique_ptr<ExcelWorkbook>> GetopeneDWorkbooks();
long GetnumberofOpeneDWorkbooks() const;
private:
wxautomationObject m_App;
};
构造函数实现如下:
ExcelApp::ExcelApp(WXIdisPATCH* dispatchPtr):wxautomationObject(dispatchPtr)
{
if (!m_App.GeTinstance("Excel.Application"))
throw std::exception("An instance of Excel object Could not be created.");
}
为了创建工作簿,我曾经使用以下代码:
std::unique_ptr<ExcelWorkbook> ExcelApp::CreateWorkbook(bool VisiblE)
{
auto wb = std::make_unique<ExcelWorkbook>();
bool suc = m_App.Getobject(*wb,"Workbooks.Add");
if (!suC)
return nullptr;
if (VisiblE)
m_App.putProperty("Visible",truE);
return std::move(wb);
}
整个 olE 实现是动态菜单的一部分。菜单事件处理程序的部分代码是:
voID MyFrame::OnExportToExcelbuttonHandler(wxCommandEvent& event)
{
auto item = static_cast<wxMenu*>(event.GetEventObject());
std::unique_ptr<ExcelWorkbook> xlsWB ((ExcelWorkbook*)event.GetEventUserData());
bool CreateNewWB = false;
try
{
//Export either the entire workbook or the active worksheet to a new Workbook
if (xlsWB == nullptr)
{
auto xlsApp = ExcelApp();
xlsWB = std::move(xlsApp.CreateWorkbook());
CreateNewWB = true;
}
在导出数据和格式方面,一切正常。但是,关闭创建的工作簿后,Excel.exe 仍然 保留在任务栏列表中。我想知道我可能会错过什么?
顺便说一下,我尝试了 wxWidgets 附带的非常基本的示例,退出后似乎没有 Excel 的幽灵实例。我
我使用 VS 2019 在 windows 10 上使用 wxWidgets 3.1.4。
编辑 1:
生成动态菜单的功能区按钮:
voID MyFrame::OnExportToExcelbuttonClicked(wxRibbonbuttonbarEvent& event)
{
auto excel = sys::win32::ole::ExcelApp();
auto PrepareMenu = [&](wxMenu* Menu)
{
try
{
wxMenuItem* item1 = Menu->Append(wxID_ANY,"New Excel Workbook");
item1->SetBitmap(wxArtProvIDer::GetBitmap(wxART_NEW));
Bind(wxEVT_COMMAND_MENU_SELECTED,&MyFrame::OnExportToExcelbuttonHandler,this,item1->GetID());
auto wbs = excel.GetopeneDWorkbooks();
if (wbs.size() > 0)
{
for (int i = 0; i < wbs.size(); ++i)
{
auto ExcelWB = std::move(wbs[i]);
wxMenuItem* item1 = Menu->Append(wxID_ANY,ExcelWB->GetFullname());
Bind(wxEVT_COMMAND_MENU_SELECTED,item1->GetID(),wxID_ANY,ExcelWB.release());
}
}
}
}
问题似乎源于以下行:
Bind(wxEVT_COMMAND_MENU_SELECTED,ExcelWB.release());
ExcelWB
指针现在归 wxWidgets 系统所有,因此引用仍然存在,因此幽灵 Excel.exe 仍然存在。
为了解决它,我在下面的过程中添加了:
voID MyFrame::OnExportToExcelbuttonHandler(wxCommandEvent& event)
{
Unbind(wxEVT_COMMAND_MENU_SELECTED,event.GetID(),xlsWB.get());
但问题依然存在。我不确定如何正确摆脱菜单现在拥有的指针。我用 shared_ptr 重新设计了一些部分,但没有帮助。
您可能已经这样做了,但只是为了确定。
在调试此类事情时,请确保应用程序实例始终可见,以便您可以看到它何时卡在等待用户输入,例如,要求保存修改后的工作簿,防止其退出。
我已经编写了基于 wxWidgets 的 MS Excel 自动化包装器 wxAutoExcel(它使用共享而不是 Excel 对象的唯一指针)并且我从未遇到过应用程序重影,除非我在调试时终止了我的应用程序,而没有处理Excel 对象。
顺便说一句,我不明白为什么您的 ExcelApp
都源自 wxAutomationObject
并且将 wxAutomationObject
作为成员变量 (@H_383_3@m_App)。 IDispatch
ctor 中使用的 ExcelApp
是什么?
最后,我似乎解决了这个问题,使用以下步骤:
wxAutomationObject
继承对象都通过 std::unique_ptr 传递。以上是大佬教程为你收集整理的OLE 自动化 - 任务管理器中的 Ghost Excel 实例全部内容,希望文章能够帮你解决OLE 自动化 - 任务管理器中的 Ghost Excel 实例所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。