Перехват событий IE без MFC и ATL
От: RIPPA  
Дата: 21.12.04 11:51
Оценка:
Задача такая: Нужно перехватывать значения из форм в IE после сабмита, но до отправки данных серверу.
Вопрос неоднократно задавался, но адекватного ответа так никто и не дал.

Использование Browser HELPER OBJECTS исключено (все можно и без них сделать).
Написать нужно на чистом API без всяких там MFC или ATL...

Уменя есть код реально работающий для MFC, кто-нить может подсказать как то-же самое можно без MFC сделать (размер программы имеет значение) ?
Текст примера:
#import "mshtml.tlb" // Internet Explorer 5
#import "shdocvw.dll"

//Следующая функция показывает, как можно подключиться к запущенному Web браузеру 
static SHDocVw::IShellWindowsPtr m_spSHWinds; 

void CIEEnumWindowsDlg::ConnectToShell() 
{
 CoInitialize(NULL);

 if(m_spSHWinds == 0) 
 {
  //
  // Получаем указатель на интерфейс ShellWindows
  //
  if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) == S_OK) 
  {
   // Каркас события 
   //
   LPCONNECTIONPOINTCONTAINER pConnPtCont;

   if ((m_spSHWinds != NULL) &&
   SUCCEEDED(m_spSHWinds->QueryInterface(IID_IConnectionPointContainer,
   (LPVOID*)&pConnPtCont)))
   {
    ASSERT(pConnPtCont != NULL);
    LPCONNECTIONPOINT pConnPt = NULL;
    DWORD dwCookie = 0;

    if (SUCCEEDED(pConnPtCont->FindConnectionPoint(
     __uuidof(SHDocVw::DShellWindowsEvents), &pConnPt)))
    {
     ASSERT(pConnPt != NULL);
     pConnPt->Advise( this->GetIDispatch(FALSE), &dwCookie);
     pConnPt->Release();
    }

    pConnPtCont->Release();
   }
  }
  else 
  {
   AfxMessageBox("Shell Windows interface is not avilable");
  }
 }
}



22.12.04 00:43: Перенесено из 'C/C++'
Re: Перехват событий IE без MFC и ATL
От: RIPPA  
Дата: 21.12.04 12:43
Оценка:
Программа задумывалась как коммерческая, так что тот кто поможет разобраться может расчитывать на материальное вознаграждение, или на пиво — кому что ближе . Полный текст примера для MFC могу на мыло скинуть.
Re: Перехват событий IE без MFC и ATL
От: Аноним  
Дата: 21.12.04 13:46
Оценка:
Здравствуйте, RIPPA, Вы писали:

RIP>Задача такая: Нужно перехватывать значения из форм в IE после сабмита, но до отправки данных серверу.

RIP>Вопрос неоднократно задавался, но адекватного ответа так никто и не дал.

RIP>Использование Browser HELPER OBJECTS исключено (все можно и без них сделать).

RIP>Написать нужно на чистом API без всяких там MFC или ATL...

RIP>Уменя есть код реально работающий для MFC, кто-нить может подсказать как то-же самое можно без MFC сделать (размер программы имеет значение) ?

RIP>Текст примера:
RIP>
RIP>#import "mshtml.tlb" // Internet Explorer 5
RIP>#import "shdocvw.dll"

RIP>//Следующая функция показывает, как можно подключиться к запущенному Web браузеру 
RIP>static SHDocVw::IShellWindowsPtr m_spSHWinds; 

RIP>void CIEEnumWindowsDlg::ConnectToShell() 
RIP>{
RIP> CoInitialize(NULL);

RIP> if(m_spSHWinds == 0) 
RIP> {
RIP>  //
RIP>  // Получаем указатель на интерфейс ShellWindows
RIP>  //
RIP>  if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) == S_OK) 
RIP>  {
RIP>   // Каркас события 
RIP>   //
RIP>   LPCONNECTIONPOINTCONTAINER pConnPtCont;

RIP>   if ((m_spSHWinds != NULL) &&
RIP>   SUCCEEDED(m_spSHWinds->QueryInterface(IID_IConnectionPointContainer,
RIP>   (LPVOID*)&pConnPtCont)))
RIP>   {
RIP>    ASSERT(pConnPtCont != NULL);
RIP>    LPCONNECTIONPOINT pConnPt = NULL;
RIP>    DWORD dwCookie = 0;

RIP>    if (SUCCEEDED(pConnPtCont->FindConnectionPoint(
RIP>     __uuidof(SHDocVw::DShellWindowsEvents), &pConnPt)))
RIP>    {
RIP>     ASSERT(pConnPt != NULL);
RIP>     pConnPt->Advise( this->GetIDispatch(FALSE), &dwCookie);
RIP>     pConnPt->Release();
RIP>    }

RIP>    pConnPtCont->Release();
RIP>   }
RIP>  }
RIP>  else 
RIP>  {
RIP>   AfxMessageBox("Shell Windows interface is not avilable");
RIP>  }
RIP> }
RIP>}

RIP>


Я не совсем понял, какое отношение имеет код, который Вы привели к той задаче, которую сформулировали.

Если Вы имели в виду, что юзер НЕ знает о присутствии Вашей программы, и жмёт САМ на сабмит, а Вы уже всё сами перехватываете, подставляете и т.д., тогда дальнейшее можно не читать.
Но, если это не так, и Вы САМИ хотите нажать на сабмит мышкой, то я бы предложил такой вариант решения: Вы программно подставляете значения в формуи и программно жмёте на сабмит.
Re[2]: Перехват событий IE без MFC и ATL
От: RIPPA  
Дата: 21.12.04 13:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я не совсем понял, какое отношение имеет код, который Вы привели к той задаче, которую сформулировали.


А>Если Вы имели в виду, что юзер НЕ знает о присутствии Вашей программы, и жмёт САМ на сабмит, а Вы уже всё сами перехватываете, подставляете и т.д., тогда дальнейшее можно не читать.

А>Но, если это не так, и Вы САМИ хотите нажать на сабмит мышкой, то я бы предложил такой вариант решения: Вы программно подставляете значения в формуи и программно жмёте на сабмит.

Я имел ввиду первое. Т.е. Юзер сам жмет на сабмит, а программа перехватывает данные из формы. Приведенный код позволяет найти точку подключения к запущеному браузеру, так вот меня интересует как можно сделать то же самое без MFC ???

Помогите кто сталкивался?!
Re[3]: Перехват событий IE без MFC и ATL
От: Аноним  
Дата: 21.12.04 14:07
Оценка:
Здравствуйте, RIPPA, Вы писали:

RIP>Здравствуйте, Аноним, Вы писали:


А>>Я не совсем понял, какое отношение имеет код, который Вы привели к той задаче, которую сформулировали.


А>>Если Вы имели в виду, что юзер НЕ знает о присутствии Вашей программы, и жмёт САМ на сабмит, а Вы уже всё сами перехватываете, подставляете и т.д., тогда дальнейшее можно не читать.

А>>Но, если это не так, и Вы САМИ хотите нажать на сабмит мышкой, то я бы предложил такой вариант решения: Вы программно подставляете значения в формуи и программно жмёте на сабмит.

RIP>Я имел ввиду первое. Т.е. Юзер сам жмет на сабмит, а программа перехватывает данные из формы. Приведенный код позволяет найти точку подключения к запущеному браузеру, так вот меня интересует как можно сделать то же самое без MFC ???


RIP>Помогите кто сталкивался?!



Вот это поможет?

LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout(hwnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
ObjectFromLresult(lRes, IID_IHTMLDocument2, 0, (void**)spDoc);

hwnd — Хендель окна броузера.
Re[4]: Перехват событий IE без MFC и ATL
От: RIPPA  
Дата: 21.12.04 15:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот это поможет?


А> LRESULT lRes;

А> UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
А> ::SendMessageTimeout(hwnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
А> ObjectFromLresult(lRes, IID_IHTMLDocument2, 0, (void**)spDoc);

А>hwnd — Хендель окна броузера.


Да я вообще разобраться не могу как на низком уровне получить указатель на интерфейс IShellWindows например...
Если бы это была функция, я бы юзал GetProcAddress, а если это интерфейс? Совсем запутался... как например такой код без MFC переписать?:

...
static SHDocVw::IShellWindowsPtr m_spSHWinds;
...
if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) == S_OK) 
  {
...
Re[5]: Перехват событий IE без MFC и ATL
От: NKZ  
Дата: 21.12.04 15:12
Оценка: +1
Здравствуйте, RIPPA, Вы писали:

RIP>Да я вообще разобраться не могу как на низком уровне получить указатель на интерфейс IShellWindows например...

RIP>Если бы это была функция, я бы юзал GetProcAddress, а если это интерфейс? Совсем запутался... как например такой код без MFC переписать?:

А при чем здесь MFC, все COM функций декларированы в ole32.dll. COM Смарт-поинтеры(_com_ptr_t) это Microsoft specific comsupp.lib.Вообщем от MFC здесь только AfxMessageBox, а от ATL вообще ничего нет. Посмотри что у тебя линкуется и используется, а не остальное можно выкинуть .
... << RSDN@Home 1.1.4 beta 3 rev. 0>>
Re: Перехват событий IE без MFC и ATL
От: Артур Россия  
Дата: 21.12.04 18:15
Оценка:
Здравствуйте, RIPPA, Вы писали:

RIP>Задача такая: Нужно перехватывать значения из форм в IE после сабмита, но до отправки данных серверу.

RIP>Вопрос неоднократно задавался, но адекватного ответа так никто и не дал.

RIP>Использование Browser HELPER OBJECTS исключено (все можно и без них сделать).

RIP>Написать нужно на чистом API без всяких там MFC или ATL...

1) Для таких сообщений есть COM/DCOM/ActiveX
2) Приведённый код не подключается к запущенному браузеру.
Приведённый код регестрирует обработчик DShellWindowsEvents, у которого оболочкой будут вызываться методы WindowRegistered/WindowRevoked, при создании и закрытии очередного окна эксплорера. Никаких других методов у DShellWindowsEvents нет.
Я не исключаю, что твоя программа всё-таки где-то подключается к эксплореру, но уж точно не в этом месте.
3)Для того, что бы получать сообщения эксплорера о посте, тебе не избежать написания COM объекта, имплементирующего DWebBrowserEvents2, у которого будет вызываться BeforeNavigate2. Пример такого объекта и подключения к эксплореру http://www.rsdn.ru/Forum/?mid=780853
Автор: Alexey Goncharov
Дата: 26.08.04
и много где на этом сайте, если воспользоваться поиском.
Конечно примеры написанны при помощи ATL. Но с другой стороны вопрос, а как ты будешь реализовать dispinterface DWebBrowserEvents2 без ATL? ручками? Думаешь это как-то повлияет на размер?
... << RSDN@Home 1.1.0 stable >>
Re[2]: Перехват событий IE без MFC и ATL
От: _gc Россия  
Дата: 23.12.04 04:19
Оценка:
А>Конечно примеры написанны при помощи ATL. Но с другой стороны вопрос, а как ты будешь реализовать dispinterface DWebBrowserEvents2 без ATL? ручками? Думаешь это как-то повлияет на размер?

Вообще-то, нет нужды имплементить DWebBrowserEvents2. Мы ведь на вход получаем IDispatch, а его имплементить гораздо проще

Автору: я всё это делал, и именно без ATL. Exe-шник получался 2560 байт. Если всё ещё что-нибудь нужно, спрашивай
Error checking omitted for clarity. (c) Microsoft
Re[3]: Перехват событий IE без MFC и ATL
От: RIPPA  
Дата: 23.12.04 09:35
Оценка:
Здравствуйте, _gc, Вы писали:

_gc>Вообще-то, нет нужды имплементить DWebBrowserEvents2. Мы ведь на вход получаем IDispatch, а его имплементить гораздо проще


_gc>Автору: я всё это делал, и именно без ATL. Exe-шник получался 2560 байт. Если всё ещё что-нибудь нужно, спрашивай


Дай если не трудно свою АСЮ, я сильно напрягать не буду, просто пару вопросов задам.
Моя: 163297
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.