程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了OLE 自动化 - 任务管理器中的 Ghost Excel 实例大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决OLE 自动化 - 任务管理器中的 Ghost Excel 实例?

开发过程中遇到OLE 自动化 - 任务管理器中的 Ghost Excel 实例的问题如何解决?下面主要结合日常开发的经验,给出你关于OLE 自动化 - 任务管理器中的 Ghost Excel 实例的解决方法建议,希望对你解决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 是什么?

,

最后,我似乎解决了这个问题,使用以下步骤:

  1. 现在使用对话框代替菜单;因此,菜单不再拥有指针。
  2. 所有 wxAutomationObject 继承对象都通过 std::unique_ptr 传递。

大佬总结

以上是大佬教程为你收集整理的OLE 自动化 - 任务管理器中的 Ghost Excel 实例全部内容,希望文章能够帮你解决OLE 自动化 - 任务管理器中的 Ghost Excel 实例所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。