首页 > 解决方案 > c++ Excel COM自动化:查询服务器状态

问题描述

我有一个问题,我做了几天的研究,但没有找到答案。

我有一个以编程方式控制 Excel 的 c++ 应用程序。具体来说,我使用 VS2017 和 MS Office 2019。

长话短说,我似乎不需要从 Excel 那里获得关于其状态以及它是否准备好从我的应用程序接收命令的反馈。因此,如果 Excel 很忙并且我的应用程序发送命令,则应用程序中存在内存泄漏导致它崩溃。

特别是我正在使用 Microsoft 的 Autowrap 功能将命令发送到 com 接口。

相关的代码块是这样的:

{
    VARIANT hresult;
    VariantInit(&hresult);
    try{ 
        AutoWrap(DISPATCH_PROPERTYGET, &hresult, xlApp, L"ActiveCell", 0);
    }
    catch (...)
    {
        std::wcout << "crashed!" << '\n';
    }
        xlActiveCell[book - 1] = hresult.pdispVal;

}

该代码实际上没有任何问题。它在 99% 的情况下都能正常工作。问题是,如果我以高频率重复单击 Excel 单元格(例如双击),当我的应用程序在 500 毫秒后发送下一个查询以获取活动单元格时,Excel 正忙于处理第一次单击,此时自动换行会抛出一个消息窗口说:

IDispatch GetIDsOfNames("ActiveCell") 失败 w/err 0x80010001

我对此进行了研究,这个错误意味着 RPC_E_CALL_REJECTED。

似乎很明显,如果发生上述情况,应该进行处理,调用 Autowrap 的方法应该空手返回,但不会使应用程序崩溃

不知何故,我找不到办法做到这一点。try/catch 块似乎没有做任何事情,我无法修改 Autowrap 以不打开消息窗口,而只是返回错误以供稍后处理。如果遇到此错误,似乎 Autowrap 会停止执行所有内容。

为什么?有没有办法解决这个问题?我错过了什么吗?

标签: c++automationexcel-2019

解决方案


推荐阅读