Задача такая: Нужно перехватывать значения из форм в 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");
}
}
}
Программа задумывалась как коммерческая, так что тот кто поможет разобраться может расчитывать на материальное вознаграждение, или на пиво — кому что ближе . Полный текст примера для 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>
Я не совсем понял, какое отношение имеет код, который Вы привели к той задаче, которую сформулировали.
Если Вы имели в виду, что юзер НЕ знает о присутствии Вашей программы, и жмёт САМ на сабмит, а Вы уже всё сами перехватываете, подставляете и т.д., тогда дальнейшее можно не читать.
Но, если это не так, и Вы САМИ хотите нажать на сабмит мышкой, то я бы предложил такой вариант решения: Вы программно подставляете значения в формуи и программно жмёте на сабмит.
Здравствуйте, Аноним, Вы писали:
А>Я не совсем понял, какое отношение имеет код, который Вы привели к той задаче, которую сформулировали.
А>Если Вы имели в виду, что юзер НЕ знает о присутствии Вашей программы, и жмёт САМ на сабмит, а Вы уже всё сами перехватываете, подставляете и т.д., тогда дальнейшее можно не читать. А>Но, если это не так, и Вы САМИ хотите нажать на сабмит мышкой, то я бы предложил такой вариант решения: Вы программно подставляете значения в формуи и программно жмёте на сабмит.
Я имел ввиду первое. Т.е. Юзер сам жмет на сабмит, а программа перехватывает данные из формы. Приведенный код позволяет найти точку подключения к запущеному браузеру, так вот меня интересует как можно сделать то же самое без MFC ???
Помогите кто сталкивался?!
Re[3]: Перехват событий IE без MFC и ATL
От:
Аноним
Дата:
21.12.04 14:07
Оценка:
Здравствуйте, RIPPA, Вы писали:
RIP>Здравствуйте, Аноним, Вы писали:
А>>Я не совсем понял, какое отношение имеет код, который Вы привели к той задаче, которую сформулировали.
А>>Если Вы имели в виду, что юзер НЕ знает о присутствии Вашей программы, и жмёт САМ на сабмит, а Вы уже всё сами перехватываете, подставляете и т.д., тогда дальнейшее можно не читать. А>>Но, если это не так, и Вы САМИ хотите нажать на сабмит мышкой, то я бы предложил такой вариант решения: Вы программно подставляете значения в формуи и программно жмёте на сабмит.
RIP>Я имел ввиду первое. Т.е. Юзер сам жмет на сабмит, а программа перехватывает данные из формы. Приведенный код позволяет найти точку подключения к запущеному браузеру, так вот меня интересует как можно сделать то же самое без MFC ???
RIP>Помогите кто сталкивался?!
Да я вообще разобраться не могу как на низком уровне получить указатель на интерфейс IShellWindows например...
Если бы это была функция, я бы юзал GetProcAddress, а если это интерфейс? Совсем запутался... как например такой код без MFC переписать?:
Здравствуйте, RIPPA, Вы писали:
RIP>Да я вообще разобраться не могу как на низком уровне получить указатель на интерфейс IShellWindows например... RIP>Если бы это была функция, я бы юзал GetProcAddress, а если это интерфейс? Совсем запутался... как например такой код без MFC переписать?:
А при чем здесь MFC, все COM функций декларированы в ole32.dll. COM Смарт-поинтеры(_com_ptr_t) это Microsoft specific comsupp.lib.Вообщем от MFC здесь только AfxMessageBox, а от ATL вообще ничего нет. Посмотри что у тебя линкуется и используется, а не остальное можно выкинуть .
Здравствуйте, 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
и много где на этом сайте, если воспользоваться поиском.
Конечно примеры написанны при помощи ATL. Но с другой стороны вопрос, а как ты будешь реализовать dispinterface DWebBrowserEvents2 без ATL? ручками? Думаешь это как-то повлияет на размер?
А>Конечно примеры написанны при помощи ATL. Но с другой стороны вопрос, а как ты будешь реализовать dispinterface DWebBrowserEvents2 без ATL? ручками? Думаешь это как-то повлияет на размер?
Вообще-то, нет нужды имплементить DWebBrowserEvents2. Мы ведь на вход получаем IDispatch, а его имплементить гораздо проще
Автору: я всё это делал, и именно без ATL. Exe-шник получался 2560 байт. Если всё ещё что-нибудь нужно, спрашивай
Здравствуйте, _gc, Вы писали:
_gc>Вообще-то, нет нужды имплементить DWebBrowserEvents2. Мы ведь на вход получаем IDispatch, а его имплементить гораздо проще
_gc>Автору: я всё это делал, и именно без ATL. Exe-шник получался 2560 байт. Если всё ещё что-нибудь нужно, спрашивай
Дай если не трудно свою АСЮ, я сильно напрягать не буду, просто пару вопросов задам.
Моя: 163297