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

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

03.10.2012, 20:44. Показов 8123. Ответов 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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,888
Записей в блоге: 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
Сообщений: 896
06.07.2013, 15:04
Цитата Сообщение от UI Посмотреть сообщение
Заменить TComInterface<IHTMLInputElement> field; на
C++
1
TComInterface<IHTMLTextAreaElement> field;
.
сделал так. теперь поле TEXTAREA заполняется, но другие поля остаются пустыми.
в форме 4 поля, одно из них TEXTAREA

Добавлено через 13 минут
вообще, если не сложно подсказать, то разбираюсь в этой ветке Заполнение веб формы в WebBrowser
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,888
Записей в блоге: 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
Сообщений: 896
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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,888
Записей в блоге: 12
07.07.2013, 13:14
Очень интересно. Что, в mshtml.h нет описаний этих интерфейсов? В моей версии Билдера (у меня XE2) они есть, на 2027 и 2099 строках, соответственно...

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

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

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

Не по теме:

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

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,888
Записей в блоге: 12
07.07.2013, 16:28
Цитата Сообщение от iiwanc Посмотреть сообщение
по прежнему программа не компилируется из-за ошибки, которую описал
А я еще раз говорю, что этот код изначально не подразумевал внесения его внутрь класса. Еще раз повторить? Или шрифт увеличить, чтобы было заметнее? Или, наконец, ты сам поймешь, что
C++
1
template <typename ItemIntf>
самой первой строкой я не от нечего делать написал? И именно из-за этой строки у тебя могут быть проблемы со внесением функции в класс (VCL диктует свои правила, и очень не любит, когда с ним пытаются работать в стиле С++, это Дельфийская библиотека в первую очередь)...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.07.2013, 02:03
UI, Есть такой вопрос как проверить успешность проведенной операции, например что кнопка найдена и успешно нажата ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,888
Записей в блоге: 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
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,010
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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,888
Записей в блоге: 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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,888
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru