Проверка указателя IDispatch при использовании автоматизации

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

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

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

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, и try ~ исключение не обнаружено.

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

0 ответов

Другие вопросы по тегам