Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.02;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2003.01.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
3-1760
Eduard
2002-12-11 15:23
2003.01.02
Проблема MSAccess и BDE


3-1763
yaJohn
2002-12-11 13:13
2003.01.02
Как заставить TClientDataSet перефильтроваться


14-1865
Anar
2002-12-12 01:30
2003.01.02
Что такое ГЫ???


4-1924
Loda
2002-11-12 15:53
2003.01.02
Список окон у MDI формы


14-1913
Uncle Archi
2002-12-11 22:58
2003.01.02
Звуки