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

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

03.10.2012, 20:44. Показов 8256. Ответов 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
07.07.2013, 16:28
Цитата Сообщение от iiwanc Посмотреть сообщение
по прежнему программа не компилируется из-за ошибки, которую описал
А я еще раз говорю, что этот код изначально не подразумевал внесения его внутрь класса. Еще раз повторить? Или шрифт увеличить, чтобы было заметнее? Или, наконец, ты сам поймешь, что
C++
1
template <typename ItemIntf>
самой первой строкой я не от нечего делать написал? И именно из-за этой строки у тебя могут быть проблемы со внесением функции в класс (VCL диктует свои правила, и очень не любит, когда с ним пытаются работать в стиле С++, это Дельфийская библиотека в первую очередь)...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.07.2013, 02:03
UI, Есть такой вопрос как проверить успешность проведенной операции, например что кнопка найдена и успешно нажата ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru