Работа с IWebBrowser2 - периодически возвращает ошибки RPC
От: blacklist  
Дата: 16.04.11 04:55
Оценка:
Здравствуйте. Имеется некоторый код, написанный на 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, либо всё работает прекрасно. Опять же, повторюсь, безо всякой закономерности. Отлаживать на тех машинах не имею возможности (только писать лог работы программы), локально воссоздать ситуацию не могу, поэтому хотелось бы узнать, в каком направлении копать, хотя бы.
Re: Работа с IWebBrowser2 - периодически возвращает ошибки R
От: okman Беларусь https://searchinform.ru/
Дата: 16.04.11 06:15
Оценка:
Здравствуйте, 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
вроде "сервер недоступен" или "ошибка на сервере".
Re[2]: Работа с IWebBrowser2 - периодически возвращает ошибк
От: blacklist  
Дата: 16.04.11 06:27
Оценка:
Я об этом думал, но слишком большое количество подобного рода ошибок из предоставленных мне логов наталкивает на определенные мысли. Я сделал повторный вызов функции и повторный CoCreateInstance в случае возникновения исключения — по логам вижу зацикливание.
Re: Работа с IWebBrowser2 - периодически возвращает ошибки R
От: dudkin  
Дата: 16.04.11 07:24
Оценка:
Здравствуйте, blacklist, Вы писали:

B>hr = pGlobalIE->get_Document(&pDispatch);

B>if(SUCCEEDED(hr))


вот так делать нельзя!
get_Document для сайтов не сэйф фор скриптинг возвращает NULL указатель и S_FALSE
А S_FALSE вообщето считается SUCCEEDED
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.