Проверка указателя 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, ¶ms, NULL, NULL, NULL);
if (SUCCEEDED(hr))
{
return TRUE;
}
}
}
return FALSE;
}
Я использовал IsBadReadPtr (), VirtualQuery (), чтобы проверить правильность указателя IDispatch, и try ~ исключение не обнаружено.
Есть ли способ проверить, действителен ли указатель IDispatch? Или есть способ узнать, закрывается ли программа Office?