如何防止通过 Visual C++ 自动化 Excel 时超时?

How to prevent Time out when Automate Excel via Visual C++?

我正在使用 Visual C++ 2008 来自动化 Excel 2010,如下所示:

    CApplication ExcelApp;

    if (ExcelApp.CreateDispatch(_T("Excel.Application"), NULL))
    {
        CWorkbooks oWorkbooks;
        CWorkbook oWorkbook;

        //  Add a workbook
        oWorkbooks = ExcelApp.get_Workbooks();
        oWorkbook = oWorkbooks.Add(vOpt);

        //  Wait for user input
        //  ::Sleep(1000 * 60 * 15);

        oWorkbook.Activate();

        //  Save workbook           
        oWorkbook.SaveAs(COleVariant(strExcelFile), COleVariant((long)xlOpenXMLWorkbook), COleVariant(_T("")), COleVariant(_T("")),
                vFalse, vOpt, (long)xlNoChange, vOpt, vOpt, vOpt, vOpt, vOpt);

        ExcelApp.Quit();
    }

在自动化过程中,我需要等待用户输入并将其保存到Excel工作簿中。如果等待时间较长,例如 15 分钟,则即将执行的 SaveAs 方法将失败,错误代码为 0x800a03ec,在 https://social.msdn.microsoft.com/Forums/Lync/en-US/92ad0462-5bfe-4353-b9e2-d13e93e712c8/cannot-save-workbook-via-automation?forum=exceldev 中有描述。

在我的代码注释中,我使用 Sleep 函数来模拟 15 分钟的等待时间,这将导致错误。

在这种情况下,有没有办法让自动化保持活动状态,以防止自动化连接超时?

为了方便重现错误,我在VS2008中做了如下两个测试项目:

  1. EADLL,这是一个MFC DLL。它包含一个 TestExcel 函数,该函数将自动执行 Excel 2010 并调用 SaveAs 将 Excel 文件保存为 .xlsx 文件格式。如果让休眠时间为15分钟,则会出现异常。

  2. EAApp,这是一个基于Dialog的应用程序来调用DLL。

我在 Windows 7 Ultimate(with SP1) 64 位版本上重新测试了 EADLL & EAApp 并确认当睡眠 15 分钟时会发生错误。

EADLL 和 EAApp 均已压缩,可从以下位置下载:

https://www.dropbox.com/s/6btgglnt9znadwp/EA.zip?dl=0

谢谢

出现问题是因为安装在本地计算机上的Excel没有激活。激活后问题解决