Здравствуйте. Имеется некоторый код, написанный на VC2008, без использования ATL, всё в одном потоке, STA.
Сперва-наперво вызываю OleInitialize() и CoCreateInstance():
if(SUCCEEDED(OleInitialize(NULL)))
{
hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, (void**)&pGlobalIE);
if(pGlobalIE && SUCCEEDED(hr))
{
pGlobalIE->put_Silent(VARIANT_TRUE);
return TRUE;
}
}
Этот код проходит отлично, инстанс создается. Далее начинается самое странное. По закону Мёрфи на имеющихся в распоряжении локальных компьютерах всё работает отлично, но при отдаче на тестинг иногда возникают ошибки в одном из следующих мест (без закономерности):
hr = pGlobalIE->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
hr = pGlobalIE->get_Document(&pDispatch);
if(SUCCEEDED(hr))
{
hr = pDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDocument);
if(SUCCEEDED(hr))
{
pDispatch->Release();
return pDocument;
}
}
hr = pDocument->get_forms(&pForms);
hr = pForms->get_length(&dwNumber);
hr = pForm->get_length(&dwNumber);
Коды ошибок — либо 0x800706be, либо 0x800706ba, либо 0x80010105, либо всё работает прекрасно. Опять же, повторюсь, безо всякой закономерности. Отлаживать на тех машинах не имею возможности (только писать лог работы программы), локально воссоздать ситуацию не могу, поэтому хотелось бы узнать, в каком направлении копать, хотя бы.
Здравствуйте, blacklist, Вы писали:
B>Здравствуйте. Имеется некоторый код, написанный на VC2008, без использования ATL, всё в одном потоке, STA.
B>Сперва-наперво вызываю OleInitialize() и CoCreateInstance():
B>B>if(SUCCEEDED(OleInitialize(NULL)))
B>{
B> hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, (void**)&pGlobalIE);
B> if(pGlobalIE && SUCCEEDED(hr))
B> {
B> pGlobalIE->put_Silent(VARIANT_TRUE);
B> return TRUE;
B> }
B>}
B>
Что такое CLSCTX_SERVER ?
B>Этот код проходит отлично, инстанс создается. Далее начинается самое странное. По закону Мёрфи на имеющихся в распоряжении локальных компьютерах всё работает отлично, но при отдаче на тестинг иногда возникают ошибки в одном из следующих мест (без закономерности):
B>B>hr = pGlobalIE->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
B>
B>B>hr = pGlobalIE->get_Document(&pDispatch);
B>if(SUCCEEDED(hr))
B>{
B> hr = pDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDocument);
B> if(SUCCEEDED(hr))
B> {
B> pDispatch->Release();
B> return pDocument;
B> }
B>}
B>
B>B>hr = pDocument->get_forms(&pForms);
B>
B>B>hr = pForms->get_length(&dwNumber);
B>
B>B>hr = pForm->get_length(&dwNumber);
B>
B>Коды ошибок — либо 0x800706be, либо 0x800706ba, либо 0x80010105, либо всё работает прекрасно. Опять же, повторюсь, безо всякой закономерности. Отлаживать на тех машинах не имею возможности (только писать лог работы программы), локально воссоздать ситуацию не могу, поэтому хотелось бы узнать, в каком направлении копать, хотя бы.
Так все вроде правильно. Объект создается в другом процессе и если этот процесс по каким-то
причинам аварийно завершается, вызовы его методов заставляют proxy возвращать коды ошибок RPC
вроде "сервер недоступен" или "ошибка на сервере".
Я об этом думал, но слишком большое количество подобного рода ошибок из предоставленных мне логов наталкивает на определенные мысли. Я сделал повторный вызов функции и повторный CoCreateInstance в случае возникновения исключения — по логам вижу зацикливание.