Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/41: Рейтинг темы: голосов - 41, средняя оценка - 4.95
79 / 34 / 6
Регистрация: 11.11.2010
Сообщений: 496

Заполнение полей на сайте

03.10.2012, 20:44. Показов 8461. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю по следующему примеру:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm1::FillForm(String Name, String Data){
// заполнение поля на форме. Name - имя поля в html коде. 
  TCppWebBrowser *WB=CWB;
  CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2>                  pDoc;
  CComQIPtr<IHTMLElementCollection, &IID_IHTMLElementCollection>  pColl;
  CComQIPtr<IDispatch, &IID_IDispatch>                            pTmpDisp;
  CComQIPtr<IHTMLInputElement, &IID_IHTMLInputElement>            pElement;
  CComQIPtr<IDispatch, &IID_IDispatch>                            pDisp;
  if ( SUCCEEDED (WB->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc)))    {
    if ( SUCCEEDED (pDoc->get_all(&pColl)))                 {
      if ( SUCCEEDED (pColl->item(TVariant(WideString(Name)), TVariant(0), &pDisp))) {
        pElement = pDisp;
        pElement->put_value(WideString(Data));
      }
    }
  }
}
Компилятор выдает ошибки. Что нужно подключить?
Миниатюры
Заполнение полей на сайте  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.10.2012, 20:44
Ответы с готовыми решениями:

Заполнение полей на сайте
Как в Builder 6 c++, программно написать что-нибудь в текстовой строчке на сайте? Например: есть...

Методы получения значений полей и методы установки значений полей
Во всех заданиях реализовать вывод на экран, методы получения значений полей и методы установки...

Дружественная функция находящая максимальное значение полей объекта первого типа и полей объекта второго типа
Само задание: Создать объект первого типа, у которого одно целочисленное свойство. Значение...

43
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33466 / 21565 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
06.07.2013, 14:06
Студворк — интернет-сервис помощи студентам
Заменить TComInterface<IHTMLInputElement> field; на
C++
1
TComInterface<IHTMLTextAreaElement> field;
. Возможно, потребуются еще какие-то изменения, надо смотреть на конкретном сайте. Вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String GetEditValue(TWebBrowser *AWebBrowser, const String AEditName)
{
    WideString result;
    TComInterface<IHTMLDocument2> pDocument;
    if( SUCCEEDED(AWebBrowser->Document->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument)) )
    {
        TComInterface<IHTMLElementCollection> Forms;
        if( SUCCEEDED(pDocument->get_forms(&Forms)) )
        {
            TComInterface<IHTMLFormElement> Form;
            if( GetChildElement(Forms, "data", 0, &Form) ) // "data" - название формы
            {
                TComInterface<IHTMLTextAreaElement> Field;
                if( GetChildElement(Form, WideString(AEditName), 0, &Field) )
                {
                    Field->get_value(&result);
                }
            }
        }
    }
    return result;
}
в одном из моих проектов работал прекрасно... Не смотри, что тут получение данных, основная проблема - найти элемент на странице, а уж что потом с ним делать - разберешься...
0
32 / 29 / 12
Регистрация: 04.03.2013
Сообщений: 897
06.07.2013, 15:04
Цитата Сообщение от UI Посмотреть сообщение
Заменить TComInterface<IHTMLInputElement> field; на
C++
1
TComInterface<IHTMLTextAreaElement> field;
.
сделал так. теперь поле TEXTAREA заполняется, но другие поля остаются пустыми.
в форме 4 поля, одно из них TEXTAREA

Добавлено через 13 минут
вообще, если не сложно подсказать, то разбираюсь в этой ветке Заполнение веб формы в WebBrowser
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33466 / 21565 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
06.07.2013, 16:16
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Цитата Сообщение от iiwanc Посмотреть сообщение
теперь поле TEXTAREA заполняется, но другие поля остаются пустыми.
Естественно, ты же наверняка просто заменил одно на другое, и пытаешься одной и той же функцией заполнить разные объекты? Не пойдет. Вот так:

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
template <typename ItemIntf>
void __fastcall FillForm2(String FiledNameOrId, String FieldText,TCppWebBrowser* Browser)
{
    // заполнение поля на форме. FiledNameOrId - Имя поля или его Id
    TComInterface<IHTMLDocument2> pDoc;
    if( SUCCEEDED(Browser->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc)) )
    {
        TComInterface<IHTMLElementCollection> pColl;
        if ( SUCCEEDED (pDoc->get_all(&pColl)))
        {
            TComInterface<ItemIntf> field;
            if( GetChildElement(pColl, WideString(FiledNameOrId), 0, &field) )
            {
                field->put_value(FieldText.w_str());
            }
        }
    }
}
 
void __fastcall TForm1::Button1Click(TObject *Sender) // кнопка заполнения
{
    FillForm2<IHTMLInputElement>("bm_url","my url", CppWebBrowser1);
    FillForm2<IHTMLInputElement>("bm_description","my description", CppWebBrowser1);
    FillForm2<IHTMLTextAreaElement>("bm_notice","my notice", CppWebBrowser1);
    FillForm2<IHTMLInputElement>("bm_tags","my tags", CppWebBrowser1);
}
прекрасно должны заполниться разные объекты нужным значением. Что ж вы так боитесь template-ов? Это ж часть С++, так используйте ее...
3
32 / 29 / 12
Регистрация: 04.03.2013
Сообщений: 897
07.07.2013, 09:05
Цитата Сообщение от UI Посмотреть сообщение
прекрасно должны заполниться разные объекты нужным значением. Что ж вы так боитесь template-ов? Это ж часть С++, так используйте ее...
конечно, просто заменил
спасибо за помощь.
использую ваш код, но появляются ошибки. Что-то нужно на форму добавить?
Ошибки в этом коде:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm2::Button2Click(TObject *Sender)
{
    FillForm2<IHTMLInputElement>("bm_url","my url", CppWebBrowser1);
    FillForm2<IHTMLInputElement>("bm_description","my description", CppWebBrowser1);
    FillForm2<IHTMLTextAreaElement>("bm_notice","my notice", CppWebBrowser1);
    FillForm2<IHTMLInputElement>("bm_tags","my tags", CppWebBrowser1);
}
//---------------------------------------------------------------------------
вот они:
Миниатюры
Заполнение полей на сайте  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33466 / 21565 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
07.07.2013, 13:14
Очень интересно. Что, в mshtml.h нет описаний этих интерфейсов? В моей версии Билдера (у меня XE2) они есть, на 2027 и 2099 строках, соответственно...

А как же код из сообщения №19 у тебя работал в таком случае?
0
32 / 29 / 12
Регистрация: 04.03.2013
Сообщений: 897
07.07.2013, 13:49
у меня работало из сообщения 18, но заполняло только 3 поля, четвертое поле (TEXTAREA) не заполнялось
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33466 / 21565 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
07.07.2013, 13:58
К сообщению №18 я не имею никакого отношения. Но... Если оно у тебя работало - значит, IHTMLInputElement все-таки известен (см. строку №41, если бы был не известен - компиляция бы не прошла). Теперь, внимание: вопрос на засыпку: если в коде из 18-ого сообщения этот интерфейс известен, то каким образом он куда-то исчез, если использовать код из сообщения №19?

Это первое. И второе: я непроверенные коды не выкладываю. Если я уже что-то запостил - то как минимум оно компилируется и линкуется. А обычно - еще и проверяется на 4-5 тестах... Больше помочь ничем не могу, значит, у тебя что-то с Билдером, если простейший код не может быть откомпилирован...
0
32 / 29 / 12
Регистрация: 04.03.2013
Сообщений: 897
07.07.2013, 16:01
Цитата Сообщение от UI Посмотреть сообщение
Это первое. И второе: я непроверенные коды не выкладываю. Если я уже что-то запостил - то как минимум оно компилируется и линкуется. А обычно - еще и проверяется на 4-5 тестах... Больше помочь ничем не могу, значит, у тебя что-то с Билдером, если простейший код не может быть откомпилирован...
вашей вины здесь и не вижу.
изначально, эту тему создавал в ветке форума С++ для начинающих. Но модераторы ее перенесли сюда... в разделе для начинающих создавал, понимая, что будет много вопросов, в том числе и простейших...

с IHTMLInputElement разобрался, но по прежнему программа не компилируется из-за ошибки, которую описал в Не могу исправить ошибку Е2316
0
07.07.2013, 16:03

Не по теме:

UI, Гиблое дело ...

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33466 / 21565 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
07.07.2013, 16:28
Цитата Сообщение от iiwanc Посмотреть сообщение
по прежнему программа не компилируется из-за ошибки, которую описал
А я еще раз говорю, что этот код изначально не подразумевал внесения его внутрь класса. Еще раз повторить? Или шрифт увеличить, чтобы было заметнее? Или, наконец, ты сам поймешь, что
C++
1
template <typename ItemIntf>
самой первой строкой я не от нечего делать написал? И именно из-за этой строки у тебя могут быть проблемы со внесением функции в класс (VCL диктует свои правила, и очень не любит, когда с ним пытаются работать в стиле С++, это Дельфийская библиотека в первую очередь)...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.07.2013, 02:03
UI, Есть такой вопрос как проверить успешность проведенной операции, например что кнопка найдена и успешно нажата ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33466 / 21565 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
15.07.2013, 16:55
Все операции, включая и IHTMLElement::click(), возвращают результат. Переделай ClickButton в функцию, и возвращай результат = true только тогда, когда успешно добрались до кнопки и ее нажали, во всех остальных случаях - false:
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
bool __fastcall ClickButton(String ButtonName,TCppWebBrowser* Browser)
{
    bool Result = false;
 
    // нажатие кнопки на форме. ButtonName - имя кнопки в html коде
    if( Browser->Document )
    {
        TComInterface<IHTMLDocument2> pDocument;
        if( SUCCEEDED(Browser->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDocument)) )
        {
            TComInterface<IHTMLElementCollection> pCollection;
            if( SUCCEEDED(pDocument->get_all(&pCollection)) )
            {
                TComInterface<IHTMLElement> button;
                if( GetChildElement(pCollection, WideString(ButtonName), 0, &button) )
                {
                    if(SUCCEEDED(button->click()))
                    {
                        Result = true;
                    }
                }
            }
        }
    }
    return Result;
}
Проверил:
C++
1
2
3
4
5
6
7
8
if (ClickButton("submiter", CppWebBrowser1))
{
    ShowMessage(L"Ok");
}
else
{
    ShowMessage(L"Ошибка");
}
(настоящее имя кнопки - "submit"), вылетело сообщение "Ошибка"
1
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
19.09.2014, 01:14
А как нажать на элемент, если у него не определено имя на форме (не обязательно кнопка) ?

Например:
HTML5
1
2
<button type="submit" title="Find" tabindex="1" 
class="flight-form_button submit-button-validation tabbed">Find</button>
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
20.09.2014, 12:41
Например, для кнопки (подозреваю, что для других объектов способ аналогичен) нужно знать ее порядковый номер (для данного типа объекта) на странице или, возможно, ее части (конкретной формы form страницы) (см. нижнюю часть кода "click SUBMIT()", тебе нужно определить TVariant, указав соответствующий индекс в скобках, у меня это vName4(3), нумерация идет с 0 или с 1, выяснишь "методом тыка" либо узнаешь в справке; возможно придется задать значение vIndex4, подробности уже не помню).
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
      LPDISPATCH pDisp, Variant *URL)
{
 String slHtmlFormName = "frmLogin"; // <form name="frmLogin"...
 
 IHTMLDocument2 *pHTMLDocument = NULL;
 if(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(
   IID_IHTMLDocument2, (LPVOID*)&pHTMLDocument)))
   {
   if(pHTMLDocument != NULL)
   {
     IHTMLElementCollection *pAll = NULL;
     if(SUCCEEDED(pHTMLDocument->get_all(&pAll)) && pAll)
     {
       TVariant vName="vb_login_username", vName2="vb_login_password", vName3="cookieuser";
       TVariant vIndex=1;
 
       // login
       IDispatch *pDisp1=NULL;
       if(SUCCEEDED(pAll->item(vName, vIndex, &pDisp1)) && pDisp1)
       {
         IHTMLInputElement *pInput = NULL;
         if(SUCCEEDED(pDisp1->QueryInterface(IID_IHTMLInputElement,
         (LPVOID*)&pInput)) && pInput)
         {
           WideString login = Memo2->Lines->Strings[0];
           if (Trim(login) != "")
           {
             pInput->put_value(login);
             auto_login = 1;  // need to login to continue
           }
           else
             auto_login = 0;  // no need to login further
           pInput->Release();
         }
         pDisp1->Release();
       }
 
       // pass
       IDispatch *pDisp2=NULL;
       if(SUCCEEDED(pAll->item(vName2, vIndex, &pDisp2)) && pDisp2)
       {
         IHTMLInputElement *pInput = NULL;
         if(SUCCEEDED(pDisp2->QueryInterface(IID_IHTMLInputElement,
         (LPVOID*)&pInput)) && pInput)
         {
           WideString pass = RSAPasswordGarena(Memo2->Lines->Strings[1]);
           if (Trim(pass) != "")
           {
             pInput->put_value(pass);
             auto_login = 1;
           }
           else
             auto_login = 0;
           pInput->Release();
         }
         pDisp2->Release();
       }
 
       // save
       IDispatch *pDisp3=NULL;
       if(SUCCEEDED(pAll->item(vName3, vIndex, &pDisp3)) && pDisp3)
       {
         IHTMLInputElement *pInput = NULL;
         if(SUCCEEDED(pDisp3->QueryInterface(IID_IHTMLInputElement,
         (LPVOID*)&pInput)) && pInput)
         {
           pInput->put_checked(1);
           pInput->Release();
         }
         pDisp3->Release();
       }
 
     }
     pAll->Release();
   }
 
    // click SUBMIT()
    IHTMLElementCollection *HTMLForms = NULL;
    if(SUCCEEDED(pHTMLDocument->get_forms(&HTMLForms)) && HTMLForms)
    {
      TVariant vName4(3);
      TVariant vIndex4 = 0;
      IDispatch *pDisp4 = NULL;
      if(SUCCEEDED(HTMLForms->item(vName4, vIndex4, &pDisp4)) && pDisp4)
      {
        IHTMLFormElement *HTMLForm = NULL;
        if(SUCCEEDED(pDisp4->QueryInterface(IID_IHTMLFormElement,
          (LPVOID*)&HTMLForm)) && HTMLForm)
        {
          if (auto_login == 1)
            HTMLForm->submit();
          auto_login = 0;
          HTMLForm->Release();
        }
        pDisp4->Release();
      }
      HTMLForms->Release();
    }
 
   pHTMLDocument->Release();
   }
}
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
22.09.2014, 11:00
Если запустить Object Inspector в Firefox, то видны скрытые элементы input которые заполняются если на форме реально нажимать на объекты HTML формы, простое программное заполнение элементов формы и нажатие на кнопку не даёт результата по корректному заполнению.

например:
HTML5
1
2
3
4
5
6
7
<script type="text/javascript"></script>
 
<input type="hidden" name="sector1_d" value=""></input>
 
<input type="hidden" name="sector1_o" value="aKUN"></input>
 
<input type="hidden" name="sector_1_d" value="22"></input>


1) Есть скрытые input элементы. как их заполнять - поля value таких элементов ?

2) Кнопка одна, но у неё нет имени:
HTML5
1
2
<button type="submit" title="Find" tabindex="1" 
class="flight-form_button submit-button-validation tabbed">Find</button>
tabindex="1" как и у большинства элементов формы.

3) Как получить список всех имён активных элементов формы ?
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
23.09.2014, 23:53
Нажимаем безымянную кнопку на форме
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  if( CppWebBrowser1->Document )
    {
    TComInterface<IHTMLDocument3> pDocument;
    TComInterface<IHTMLElementCollection> pElementColl;
    TComInterface<IHTMLElement> pElement;
    TComInterface<IDispatch> pDisp;
      CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument3,
                                        (LPVOID*)&pDocument);
      if( pDocument )
        {
        pDocument->getElementsByTagName(L"button",&pElementColl);
        pElementColl->item(TVariant("порядковый (по ходу встречи тэга <button> HTML кода)
                                 номер кнопки в HTML форме 0,1,2 и т.д."),TVariant(0),&pDisp);
 
          if ( pDisp ) {
                 pDisp->QueryInterface(IID_IHTMLElement,(LPVOID*)&pElement);
                if( pElement ){
                    pElement->click();
                }
          }
        }
     }
1
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
01.10.2014, 00:29
Как правильно пользоваться ->Release() для интерфейсов, если в цикле перебирать элементы ?

Чего-то постоянно ошибки при выполнении кода что с Release() что без него.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33466 / 21565 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
01.10.2014, 01:24
Вытащил из своего проекта:
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
        if (SUCCEEDED(pHTMLDocument2->get_images(&Images)) && Images)
        {
            long ImagesCount = 0;
            if (SUCCEEDED(Images->get_length(&ImagesCount)))
            {
                for (int i = 0; i < ImagesCount; i++)
                {
                    IHTMLImgElement* Image = NULL;
                    IDispatch* Disp = NULL;
                    Variant item = i;
                    Variant index = 0;
                    if (SUCCEEDED(Images->item(item, index, &Disp)) && Disp)
                    {
                        if (SUCCEEDED(Disp->QueryInterface(IID_IHTMLImgElement, (void**)&Image)) && Image)
                        {
                            IHTMLElementRender *spElemRender;
                            HRESULT hr = Image->QueryInterface(IID_IHTMLElementRender, (void**)&spElemRender);
                            if (SUCCEEDED(hr) && spElemRender)
                            {
                                // обработка изображения
                                spElemRender->Release();
                            }
                            Image->Release();
                        }
                        Disp->Release();
                    }
                }
            }
            Images->Release();
        }
, никаких ошибок не выбрасывает. Как видишь, QueryInterface-у соответствует Release(), точно так же, как и получению очередного item-а... Если используется TComInterface, то освобождать его не надо, это будет сделано автоматически... Но не всегда работает с TComInterface-ами, иногда приходится по-старинке...
0
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
01.10.2014, 01:41
Если в цикле прокручивать элементы из IHTMLElementCollection, то при следующем pElementColl->item(TVariant(i),TVariant(0),&pDisp); происходит ошибка.

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
  if( CppWebBrowser1->Document )
    {
    TComInterface<IHTMLDocument3> pDocument;
    TComInterface<IHTMLElementCollection> pElementColl;
    TComInterface<IHTMLElement> pElement;
    TComInterface<IDispatch> pDisp;
      CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument3,
                                        (LPVOID*)&pDocument);
      if( pDocument )
        {
            pDocument->getElementsByTagName(L"",&pElementColl);
            pDocument->Release();
 
        if (pElementColl)
        {
         long j;
         pElementColl->get_length(&j);
 
            for (long i = 0; i < j; ++i) {
                pElementColl->item(TVariant(i),TVariant(0),&pDisp);
                pElementColl->Release();
                    if ( pDisp ) {
                    pDisp->QueryInterface(IID_IHTMLElement,(LPVOID*)&pElement);
                    pDisp->Release();
                        if( pElement )
                        {
 
                            pElement->click();
                            pElement->Release();
 
                        }
                    }
 
            }
 
 
        }
        }
    }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33466 / 21565 / 8249
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
01.10.2014, 02:15
Естественно, ты ж после того, как вытащил первый же элемент из коллекции, саму коллекцию удалил (в 21 строке). А это удаление должно было быть здесь:

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
    if (CppWebBrowser1->Document)
    {
        TComInterface<IHTMLDocument3>pDocument;
        TComInterface<IHTMLElementCollection>pElementColl;
        TComInterface<IHTMLElement>pElement;
        TComInterface<IDispatch>pDisp;
        CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument3, (LPVOID*)&pDocument);
        if (pDocument)
        {
            pDocument->getElementsByTagName(L"", &pElementColl);
            if (pElementColl)
            {
                long j;
                pElementColl->get_length(&j);
 
                for (long i = 0; i < j; ++i)
                {
                    pElementColl->item(TVariant(i), TVariant(0), &pDisp);
                    if (pDisp)
                    {
                        pDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)&pElement);
                        if (pElement)
                        {
                            pElement->click();
                            // pElement->Release(); // прямо перед окончанием if-а, проверяющего валидность pElement
                        }
                        // pDisp->Release(); // прямо перед окончанием if-а, проверяющего валидность pDisp
                    }
                }
                // pElementColl->Release(); // прямо перед окончанием if-а, проверяющего валидность pElementColl
            }
            // pDocument->Release(); // прямо перед окончанием if-а, проверяющего валидность pDocument
        }
    }
Но я вообще закомментировал, ибо у тебя TComInterface, не надо их принудительно освобождать, они сами освободятся. Были бы указатели без оберток - тогда Release() все надо было бы расскомментировать...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2014, 02:15

Заполнение полей Table из Memo
Прошу помочь советом. Дело в том, что мне нужно заполнить поля Table1 из Memo1. Содержимое Memo1...

Создание динамического списка с элементами типа запись и заполнение полей из файла
Народ помогите написать программу очень нужно: программа должна содержать: 1) Создание...

Заполнение полей структуры
Подскажите, в чем ошибка. #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; struct sign { char...

Заполнение полей массива
Доброе время суток! Не могу понять, в чем ошибка! Мне нужно чтобы преподавателей можно было...

Заполнение полей структуры
Нужна ваша помощь! Нужно считать файл и записать в массив. Потом из этого массива надо раскидать...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru