Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.01.02;
Скачать: [xml.tar.bz2];

Вниз

IE как IWebBrowser   Найти похожие ветки 

 
saniok   (2002-11-12 12:22) [0]

Здравствуйте!

У меня вопрос! Я хочу запустить интернет эксплорер из своей программы, а потом работать с ним, как с IWebBrowser2. Как делать, что читать, с чего начать?


 
int64   (2002-11-12 13:52) [1]

uses ..., SHDocVw;
...
procedure TForm1.Button2Click(Sender: TObject);
var IE: TInternetExplorer;
begin
IE := TInternetExplorer.Create(Self);
IE.OnBeforeNavigate2 := MyBeforeNavigate2;
IE.OnNewWindow2 := MyNewWindow2;
.........
IE.Visible:= True;
IE.Navigate("about:<h1>Hi, World</h1>");
end;


 
saniok   (2002-11-13 13:33) [2]

Это хорошее решение, спасибо!

Но мне обязательно нужно запустить IE через CreateProcess, возможно ли как нить получить такой доступ к нему?
А можно как-нить можно его окно присвоить TWebBrowser? Чтобы он показывал то же самое, что и ентот интернет эксплорер?


 
Ihor Osov'yak   (2002-11-13 17:55) [3]

eще вариант

Iwb := CreateOleObject("InternetExplorer.Application.1") as IWebBrowser2;

Правда, с нотификацией тут немножко посложнее - нужно "ручками"
подписываться на нотивикацию. Но более универсально, так как если не ошибаюсь, TInternetExplorer появился в IE5, в четвертом еще не было ...



 
int64   (2002-11-13 18:46) [4]

saniok (13.11.02 13:33)

> Но мне обязательно нужно запустить IE через CreateProcess,
> возможно ли как нить получить такой доступ к нему?

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1037017694&n=0

> А можно как-нить можно его окно присвоить TWebBrowser? Чтобы
> он показывал то же самое, что и ентот интернет эксплорер?

"Зеркалирование" одного приложения другим вещь, конечно, интересная - никогда такого не видел. )
А какой практический смысл?

Ihor Osov"yak © (13.11.02 17:55)
Надо двигать технологии вперёд. Пусть все ставят IE6, и не забивают голову всякой ерундой. :)
Время такое, что даже неуважающая себя программа при инсталяции, если юзает IE, требует необходимую версию этого IE. И, как правило, предоствляет его с дистрибутивами.


 
saniok   (2002-11-13 19:57) [5]

>int64

Спасибо, но что-то у меня не выходит. Выбрасывает Access violation... Вот код:


st.lpReserved:=nil;
st.lpDesktop:=nil;
st.lpTitle:=nil;
st.dwFlags:=0;
st.cbReserved2:=0;
st.lpReserved2:=nil;
st.cb:=sizeof(st);
createProcess( "c:\program files\Internet Explorer\Iexplore.exe",nil,nil,nil,true,NORMAL_PRIORITY_CLASS,nil,nil,st,st1);

GetIEFromHWND(st1.hProcess, Brows);
HTMLBody(HTMLDocument(Brows.Document).body).innerHTML := "Hello world!"; // а здесь access violation...



Что-то я не так делаю?


 
int64   (2002-11-14 02:43) [6]


> Что-то я не так делаю?

Ну ещё бы, вместо хендла окна - хендл процесса ставить.
И не мешало бы проверять Brows после создания на <>nil.


 
Opuhshii   (2002-11-14 14:21) [7]

Ishellwindows, и неважно кто запустил IE


 
saniok   (2002-11-14 21:09) [8]

>int64

Согласен, но как по хендлу процесса получить хендл окна?



 
Ihor Osov'yak   (2002-11-15 13:14) [9]

2 int64 © (13.11.02 18:46)


> Надо двигать технологии вперёд. Пусть все ставят IE6, и
> не забивают голову всякой ерундой. :)
> Время такое, что даже неуважающая себя программа при инсталяции,
> если юзает IE, требует необходимую версию этого IE. И, как
> правило, предоствляет его с дистрибутивами.


Ну, предположим заказчик доволько часто ставит условие IE4 compatible.

Во вторых, есть два очень интересных бага в IE6, касающихся referral через OnNewWindow и OnDocumentComplete, напрочь отсуствующих в IE5 (в ie5.5 есть только проблемЫ с referral).
Для борьбы с которымы нужно несколько извращатся.

Это так, про двигание новых технологий.



 
saniok   (2002-11-16 15:21) [10]

вопрос не снят
как в данном случае по хендлу процесса получить хендл окна?


 
Ihor Osov'yak   (2002-11-17 01:23) [11]

Пpямо - никак. У пpоцесса может быть ну очень много top-level окон. Или воообще не быть.

.. Можешь обратить внимание на EnumThreadWindows.

Юзать примерно так (пишу "теоритически", могут быть опячатки):


function EnumeratorWindow(hWnd: HWND; lParam: LongInt): Boolean; begin
....
end;

procedure EnumThreadWindows(const ThreadId: DWORD);
var param:integer;
begin
...
if EnumThreadWindows(ThreadId, @EnumeratorWindow,
LongInt(@param))) then
begin
....
end;
end;




 
kostik78ua   (2002-11-17 01:33) [12]

Поможет или нет - не знаю, но окно эксплорера ищется так

WindowHandle:=FindWindow("IEFrame",nil);

правда функция найдет первое попавшееся окно эксплорера, но все же... :)


 
int64   (2002-11-17 02:41) [13]

Ihor Osov"yak © (15.11.02 13:14)
То было всего лишь моё имхо.
Новые технологии - новые грабли. Но стоять на месте - себе дороже. Проверено.
А если заказчик привередничает, или "лучше знает", то пусть доплачивает, и получит своё.

saniok (16.11.02 15:21)
Для твоей задачи:
Перебири все окна класса "IEFrame".
Для каждого получи его ThreadId и ProcessId функцией GetWindowThreadProcessId.
Если они совпадают с id-ми процесса, значит нашли.

Пару моментов.
Окно создастся не сразу после createProcess, делай Sleep.
Попап окно (н. ctrl+n) создастся в том же процессе, но в другом потоке.


 
Ihor Osov'yak   (2002-11-17 14:04) [14]

2 int64 © (17.11.02 02:41)


> А если заказчик привередничает, или "лучше знает", то пусть
> доплачивает, и получит своё.


Полностью согласен. Но у меня наиболее скромные по цене "IE5 compatible". IE6 compatible обходятся даже дороже, чем IE4.

Зы. А унас с Вами несколько сходная специализация? Во всяком случае одна ветка.. :-)



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.01.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
14-1880
vopros
2002-12-12 12:20
2003.01.02
У меня сегодня рабочий день


1-1774
Checist [root]
2002-12-20 11:05
2003.01.02
Вопрос к Kabro (плиз ответь)


14-1860
Ketmar
2002-12-06 20:02
2003.01.02
а я Сплин слушаю. и Океан Эльзы. кто еще такой извращенец?


3-1759
Valeron
2002-12-12 09:33
2003.01.02
Как преодразовать HTML таблицу в dBase или т.п.?


3-1751
Сергей
2002-12-11 14:17
2003.01.02
пример программной настройки опций безопасности в MSDE?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский