Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Иван Петрович 1
0 / 0 / 0
Регистрация: 10.01.2012
Сообщений: 1
1

Получение кода страницы в потоке используя CppWebBrowser

13.01.2012, 16:21. Просмотров 2522. Ответов 1
Метки нет (Все метки)

Проблема состоит в том, что во время выполнения кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
AnsiString url_site = "http://www.google.ru";
TVariant x = url_site;  
Form1->CppWebBrowser1->Navigate2(&x, NULL, NULL, NULL, NULL);
while (Form1->CppWebBrowser1->ReadyState != 4)
{
 Application->ProcessMessages();;
}
TComInterface<IHTMLDocument2> pHTMLDocument;
TComInterface<IHTMLElement> pEl;
 
if (S_OK != Form1->CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*) &pHTMLDocument)) return; 
 
 if (S_OK != pHTMLDocument->get_body(&pEl)) return; 
 
       WideString wHtmlCode;
       pEl->get_innerHTML(&wHtmlCode);
       Form1->Memo2->Text = wHtmlCode;
в потоке выходит ошибка: raised exception class eaccessviolation with message 'access violation at address in module mshtml.dll
страница загружается, но исходный код не выводится в memo.

при выполнении данного кода не в потоке все работает правильно и корректно.
Подскажите пожалуйста решение проблемы. В поисковиках рылся уже 2 дня и не нашел ничего конкретного по решению данной ошибки.

Добавлено через 16 часов 38 минут
Вопрос решился:
Ссылка
 Комментарий модератора 
Правила
п.3.7. Запрещено публиковать ссылки на другие форумы.
Хотите сделать доброе дело - скопируйте и выложите сюда решение.


Добавлено через 45 минут
Но если выполение данного кода происходит циклично (т.е. загружается несколько страниц по порядку),
исходный код первой страницы загружается нормально, а на второй страницы выводится сообщение:
"_ASSERTE intf != 0 @ c:\program files..........vcl\utilcls.h/2912 Press Y,N,C "
и выводит курсор на строчку: pEl->get_innerHTML(&wHtmlCode);
как это решить подскажите?
чем дальше тем круче((

Добавлено через 5 часов 17 минут
Итоговая версия, вроде работает как мне нужно и без ошибок. насчет правильности и корректности не уверен - приоритет на результат ставлю:
файл unit2.h:
Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class Thread : public TThread
{            
private:
protected:
 
        void __fastcall Execute();
public:
        __fastcall Thread(bool CreateSuspended);
 
         void __fastcall Thread::AddMemo();
};
 
 
Файл Unit2.cpp:
Код:
 
__fastcall Thread::Thread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
 
}
 
 
void __fastcall Thread::Execute()
{
 
for (int i = 0; i < Form1->Memo1->Lines->Count; i++)
          {
          AnsiString url_site = Form1->Memo1->Lines->Strings[i];
          TVariant x = url_site;  // сайт
          Form1->CppWebBrowser1->Navigate2(&x, NULL, NULL, NULL, NULL);
          while (Form1->CppWebBrowser1->ReadyState != 4)
                  {
                  
                  Sleep(50);
                  } // ждет пока полностью не загрузится страница
 
          Synchronize(&AddMemo);
          
         .........................................................
         ..........................................................
         Form1->Memo3->Clear();
         if(Terminated) break;// проверка на закрытие потока
         }
return;
}
 
void __fastcall Thread::AddMemo()
{
 TComInterface<IHTMLDocument2> pHTMLDocument;
 TComInterface<IHTMLElement> pEl;
 
 if (S_OK != Form1->CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*) &pHTMLDocument)) return; // запрос интерфейс документа
 if (S_OK != pHTMLDocument->get_body(&pEl)) return; // тело документа
 
 WideString wHtmlCode;
 pEl->get_innerHTML(&wHtmlCode);
 
 Form1->Memo3->Text = wHtmlCode;
 
 return;
}
Компилировал в Builder 6
Если есть какие нибудь еще предложения по поводу корректности кода прошу поделиться.

 Комментарий модератора 
Есть предложение использовать тег кода при вставке кода .
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2012, 16:21
Ответы с готовыми решениями:

Получение кода web страницы
Всем доброго времени суток... Задача заключается в следующем ... : есть сайт, например...

Высота страницы в CppWebBrowser
Доброе время суток. Подскажите пожалуйста можно ли в CppWebBrowser определить высоту...

Определение завершения загрузки страницы в CppWebBrowser
Проблема в следующем: есть страница, содержащая в себе несколько фреймов и ява-скриптов. Как...

CppWebBrowser. Как открыть часть страницы.
Всем доброго времени суток. интересует как открыть часть страницы с помощью cppwebbrowser. (Есть...

CppWebBrowser, доступ к картинкам HTML страницы
Подскажите как быть. Есть компонент CppWebBrowser, в него загружаем некоторую страницу....

1
BRcr
4025 / 2314 / 292
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
14.01.2012, 11:08 2
Из Execute() ни к чему напрямую лучше не обращаться, даже для чтения. Тыщу раз может отработать без ошибок, а на тыща первый вылетит access violation... а может и наоборот, как повезет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Thread : public TThread {            
private:
        int memo_lines_count, iter;
        
        void __fastcall get_memo_lines_count(void);
        void __fastcall get_site_url_and_navigate(void);
        void __fastcall add_memo(void);
        void __fastcall clear_memo(void);
protected: 
        void __fastcall Execute();
public:
        TVariant site_url;       
         
        __fastcall Thread(bool CreateSuspended);
};
////////////////////////////////////////////////////////////////////////////////
__fastcall Thread::Thread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//////////////////////////////////////////////////////////////////////////////// 
void __fastcall Thread::get_memo_lines_count(void) {
    memo_lines_count = Form1->Memo1->Lines->Count;
}
////////////////////////////////////////////////////////////////////////////////
void __fastcall Thread::get_site_url_and_navigate(void) {
    site_url = Form1->Memo1->Lines->Strings[iter];
    Form1->CppWebBrowser1->Navigate2(&site_url, NULL, NULL, NULL, NULL);
    while (Form1->CppWebBrowser1->ReadyState != 4){
        Sleep(50);
    } // ждет пока полностью не загрузится страница
}
////////////////////////////////////////////////////////////////////////////////
void __fastcall Thread::add_memo(void) {
    TComInterface<IHTMLDocument2> pHTMLDocument;
    TComInterface<IHTMLElement> pEl;
     
    if (S_OK != Form1->CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*) &pHTMLDocument)) return; // запрос интерфейс документа
    if (S_OK != pHTMLDocument->get_body(&pEl)) return; // тело документа
     
    WideString wHtmlCode;
    pEl->get_innerHTML(&wHtmlCode);
     
    Form1->Memo3->Text = wHtmlCode;
}
////////////////////////////////////////////////////////////////////////////////
void __fastcall Thread::clear_memo(void) {
    Form1->Memo3->Clear();
}
////////////////////////////////////////////////////////////////////////////////
void __fastcall Thread::Execute()
{
    Synchronize(&get_memo_lines_count);
    for (iter = 0; !Terminated && iter < memo_lines_count; iter++) {
        Synchronize(&get_site_url_and_navigate);
        Synchronize(&add_memo);
        // ...
        Synchronize(&clear_memo);       
    }
}
////////////////////////////////////////////////////////////////////////////////
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2012, 11:08

CppWebBrowser. Загрузка веб-страницы в целевой Фрейм
Доброго времени суток. Возникла у меня такая проблема, на форме у меня есть 2 кнопки и...

Как узнать html код страницы в CppWebBrowser
Гружу страницу в CppWebBrowser. После этого надо в Memo2 передать ее код. пробовал и...

CppWebBrowser - Узнать состояние страницы после выполнения команды Navigate
Доброе время суток! Проблема: Выполняю строку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru