Проверка указателя IDispatch при использовании автоматизации - PullRequest
0 голосов
/ 17 марта 2020

Я использую Automation для управления программой MS Office.

Подключите, если запущена программа Office, или запустите новый Office в фоновом режиме, если это не так.

Однако очень редко, когда Office входит в процедуру завершения работы, при одновременном вызове Invoke () возникает ошибка Windows Runtime.

BOOL SetValue(IDispatch *pDispatch, LPOLESTR lpOleStr, DISPPARAMS params)
{
    if (pDispatch != NULL && lpOleStr != NULL)
    {
        DISPID dispID;

        HRESULT hr = pDispatch->GetIDsOfNames(IID_NULL, &lpOleStr, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
        if (SUCCEEDED(hr))
        {   
            hr = pDispatch->***Invoke***(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &params, NULL, NULL, NULL);
            if (SUCCEEDED(hr))
            {
                return TRUE;
            }
        }       
    }

    return FALSE;
}

Я использовал IsBadReadPtr (), VirtualQuery () для проверки правильности указатель IDispatch и попытка исключения ~ не перехвачены.

Есть ли способ проверить, действителен ли указатель IDispatch? Или есть способ узнать, закрывается ли программа Office?

...