Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Доступ к объектам TCppWebBrowser в отдельном потоке

11
24 января 2008 года
oxotnik333
2.9K / / 03.08.2007
Есть функция выгрузки объектов (картинки, видео и т.п.) хтмл страницы из БД:

Код:
DWORD WINAPI ExtractDocObj (LPVOID pCWB)
{
  TCppWebBrowser *CWB = (TCppWebBrowser*)pCWB;
  if (CWB->Document == NULL) return 1;

  CComPtr<IHTMLDocument2>spDoc;
  CComPtr<IHTMLElementCollection>spImgCol;
  CComPtr<IHTMLEmbedElement>spEmbEl;
  CComPtr<IDispatch>spDisp;
  CWB->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&spDoc);
  if (!spDoc) return 1;
  spDoc->get_images(&spImgCol);
  spDoc->get_embeds(&spEmbCol);
  long Img_ln, Emb_ln;
  spImgCol->get_length(&Img_ln);
  spEmbCol->get_length(&Emb_ln);
  VARIANT ind;
  ind.vt = VT_I4;
  WideString src;
  for (long i=0; i<Emb_ln; i++) // EMBED's
      {
        ind.lVal = i;
        spEmbCol->item(ind,ind, &spDisp);
        if (!spDisp)continue;
        spDisp->QueryInterface(IID_IHTMLEmbedElement, (LPVOID*)&spEmbEl);
        spEmbEl->get_src(&src);
        spDisp.Release();
        spEmbEl.Release();

        DM->ObjQuery->Active = false;
        DM->ObjQuery->Parameters->ParamByName("@Key")->Value = MainForm->ExtractObjId (String(src));
        if (!(FileExists(MainForm->ProgramPatch() + String(src))) && !(FileExists(MainForm->ProgramPatch() + String(src))) && !(FileExists(MainForm->ProgramPatch() + String(src))))
           DM->ObjQuery->Active = true;
        Application->ProcessMessages();
        if (DM->ObjQuery->Active) DM->ObjQueryObjBody->SaveToFile(MainForm->ProgramPatch() + "media\\"+ DM->ObjQueryId->AsString + DM->ObjQueryObjName->AsString);
      }
  return 0;
}

вызываю ее отдельным потоком в событии TCppWebBrowser::NavigateComplete2
 
Код:
CreateThread( NULL , 0 , ExtractDocObj, WB , 0 , NULL );


пока функция ExtractDocObj вызывалась вне потока, все нормально работало
в потоке при пробеге коллекции документа в spDisp

spEmbCol->item(ind,ind, &spDisp);

передается только с 3-го раза (в лучшем случае)

В чем может быть проблема?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог