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

Вниз

Подключение к событиям IE   Найти похожие ветки 

 
Дмитрий Баранов   (2002-11-11 15:28) [0]

Ну да, на RSDN статья есть отличная, но проблема в том, что надо бы постараться подключиться к событиям IE, когда он в своем окошке, а не как ActiveX контрол на диалоге или форме лежит. У кого соображения есть?
Спасибо.


 
Fantasist   (2002-11-11 20:24) [1]

А никак. Хоть и в своем окошке, но создавать его нужно как OLE объект, иначе доступ к интерфейсам не получишь. Некоторые изгаляются так: пишут програмку, которая таким образом открывает IE и им управляет, а при инсталяции подменяют ссылки на exe-шник IE. Можно, конечно, и сам exe-шник подменить, но тогда надо реестр подредактировать.


 
Оливейра   (2002-11-12 00:02) [2]

Можно попробовать, но вероятнее всего, не сработает.

1) Кинуть WebBrowser, установить на about:blank, потом сделать снова Navigate на about:blank, но в отдельном окошке. Попытаться получить IHTMLDocumentX. Правда, Х его Знает, интерфес какого окошка предоставится.

2) Есть очень идиотская идея. Лучше промолчу :)) Сам попробую. С адресами поковыряться. Нобелевскую дадут!


 
Fantasist   (2002-11-12 01:29) [3]


> Оливейра © (12.11.02 00:02)


Вы так говорите, потому что не знаете основы функциониравания COM. Для того, чтобы получить интерфейс объекта, нужно
уже иметь его интерфейс. Нельзя получить интерфейс просто у процесса. Кроме того, для межпроцессорного взаимодействия необходимо чтобы и COM-клиент и COM-сервер загрузили библиотеку маршалинга, так как без нее передача адресов из процесса в процесс не имеет смысла.


 
Оливейра   (2002-11-12 01:47) [4]

Не п.. те, батенька :)) Ловите код. Он не оптимизирован, пИсано на коленках, оптимизируйте сами, я Delphi не очень знаю.

И не надо умными словами кидаться, мы Трельсена, Бокса и MSDN читаем и ATL от зубов.
Мало того, в приватные переменные кокласса залезть тоже очень возможно при наличии исходников и калькулятора( с IE я пас. Это надо с дебаггером неделю сидеть )

Нонсенс, бляха-муха - IE-как сервер автоматизации :)
Невозможное - возможно.


type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
VB: IWebBrowser2;
public
{ Public declarations }
end;

procedure TForm1.Button1Click(Sender: TObject);
var Doc: DispHTMLDocument;
IDoc: IHTMLDocument2;
Disp: IDispatch;
Url : OleVariant;
D : OleVariant;
Body: DispHTMLBody;
begin
VB := nil;
OleCheck
(
CoCreateInstance(
stringtoguid("{0002DF01-0000-0000-C000-000000000046}"),
nil,
4,
stringtoguid("{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}"),
VB
)
);
VB.Visible:=true;
Url:="about:blank";
VB.Navigate2(Url, D,D,D,D);
Doc:=VB.Document as DispHTMLDocument;
Body:=Doc.body as DispHTMLBody;
Body.InnerHTML := "<h1>Hello world</h1>";
end;


Если это у Вас работать не будет - слазьте OleView`ом в библиотеку типов IE и подставьте гуиды, какие надо поновее.

К событиям через IDispatch подключиться - как пописать на два пальца.

МАСТЕРА МНЕ!!! ЗНАЧОК ХОЧУ!!!


 
Оливейра   (2002-11-12 01:52) [5]

А он - "реестр подрезать, екзешник подменить" :))

Я доволен как слон и пошел спать.

Христос с вами. 12.11.2002


 
Fantasist   (2002-11-12 02:27) [6]

Так тут и есть создание IE как CОМ объекта. Естесственно, что таким образом это и можно сделать. Я же говорил о том, что невозможно подключиться к IE если его просто запустил пользователь. Или вы привязались к моей реплике
> "создавать его нужно как OLE объект"
, которую, признаю, бросил неаккуратно, надо было сказать "COM объект".


> А он - "реестр подрезать, екзешник подменить" :))
>
> Я доволен как слон и пошел спать.


Ну ваше право быть довольным, но ничего сверхестесственного вы не продемонстрировали. Использовать CoCreateInstance умеют большое количество народу. Хотя это не очень то и нужно ибо есть вспомогательные функции Делфи. В вашем примере лучше было написать так:


...
begin
VB:=CreateOleObject("InternetExplorer.Application") as IWebBrowser2;
....


И в OleView не нужно лезть. Ибо VersionIndependentProgID есть всегда.


> К событиям через IDispatch подключиться - как пописать на
> два пальца.


Через IDispatch никто никогда к событиям не подключался.


 
int64   (2002-11-12 13:45) [7]


> невозможно подключиться к IE если его просто запустил пользователь

Вариант 1.
Подключаться к IE по хендлу окна браузера.
Вот функция:


type
TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall;

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
hInst: HWND;
lRes: Cardinal;
MSG: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
begin
WHandle := FindWindowEX(WHandle, 0, "Shell DocObject View", nil);
WHandle := FindWindowEX(WHandle, 0, "Internet Explorer_Server", nil);
hInst := LoadLibrary("Oleacc.dll");
@ObjectFromLresult := GetProcAddress(hInst, "ObjectFromLresult");
if @ObjectFromLresult <> nil then begin
try
MSG := RegisterWindowMessage("WM_HTML_GETOBJECT");
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
if Result = S_OK then
(pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
finally
FreeLibrary(hInst);
end;
end;
end;


Вариант 2.
Юзать Ishellwindows.
Вот пример:


procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
sw: Ishellwindows;
wb: IWebbrowser2;
begin
sw:= CoShellWindows.Create;
for i := 0 to SW.Count - 1 do
begin
wb:= Sw.Item(i) as IWebbrowser2;
HTMLBody(HTMLDocument(wb.Document).body).innerHTML:="<h1>Hi, World</h1>";
end;
end;


А помимо CreateOleObject("InternetExplorer.Application"), чтобы своеручно запустить IE и с ним работать, есть такой объект - TInternetExplorer.
См. сюда:

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;


 
Дмитрий Баранов   (2002-11-12 15:40) [8]

Спасибо, только не деритесь и не грубите :)

>int64 © (12.11.02 13:45)
hInst := LoadLibrary("Oleacc.dll");
@ObjectFromLresult := GetProcAddress(hInst, "ObjectFromLresult");

А это в каких анналах найдено? :) Была у меня тоже мысль с адресами поковыряться, но чего-то в MSDN такого не пробегало...


 
int64   (2002-11-12 17:03) [9]

Как это не пробегало! Вот у меня открыта страница (CD):
Active Accessibility Server Functions.

> А это в каких анналах найдено? :)

Вообще сия штука уже года два как по инету ходит. По крайней мере, столько её наблюдаю.


 
Fantasist   (2002-11-12 19:40) [10]


> Вариант 1.
> Подключаться к IE по хендлу окна браузера.
>


Да действительно. Весьма не типично, для COM объектов - подключение через Active Accessibility, забавно. Будем знать.


> Юзать Ishellwindows.
> Вот пример:


Даже так. Я думал, что таким образом можно его как раз создать.
Неудивительно, что через IE все лезут, столько окон в него повставляли.


> А помимо CreateOleObject("InternetExplorer.Application"),
> чтобы своеручно запустить IE и с ним работать, есть такой
> объект - TInternetExplorer


Есть, но не во всех версиях, поэтому я его упоминать не стал. Ведь и TWebBrowser есть - более известная и ране появившаяся вещь. Почти ничем не отличается.


 
Fantasist   (2002-11-12 20:38) [11]

А фигня все это. Или тут что-то не так. Дело в том, что когда-то у кого-то возник вопрос по поводу подключение к IE. Я естесственно полез через GetActiveObject и тот вернул, что такого объекта нет. После этого я решил, что когда его просто запускаешь, он не инициализируется c OLE. Cейчас я попробывал то же самое, но на этот раз такая вещь сработала:


procedure TForm1.Button1Click(Sender: TObject);
var
iu:IUnknown;
wb:IWebBrowser2;
It:TInternetExplorer;
ClassID: TCLSID;
begin
iu:=nil;
ClassID := ProgIDToClassID("InternetExplorer.Application");
GetActiveObject(ClassID,nil,iu);
if iu<>nil then
begin
wb:=iu as IWebBrowser2;
It:=TInternetExplorer.Create(self);
It.FIntf:=wb;
It.Navigate("rsdn.ru");
end;
end;


Странно. Может у меня вирь какой-то сидит. Или я в прошлый раз как-то CLSID неправильно задал, или еше чего-то неправильно сделал. Проверьте пожалуйста у себя, если у вас не сработает, значит у меня кто-то поселился. А если вдруг сработает... то значит и у вас кто-то поселился. :) Потому что подключаться таким образом гораздо проще и удобнее + легкое подключение к событиям.


 
Дмитрий Баранов   (2002-11-12 20:53) [12]

Ага, спасибо.
В общем-то он прав, мне надо не к событиям собственно WebBrowser прицепиться, а ловить всякие onclick на элементах... привычнее это через GetIdsOfNames и Invoke сделать.



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

Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
7-69606
DMdeveloper
2002-09-14 18:57
2002.11.21
Работа с USB устройством.


14-69544
AZ
2002-11-03 06:39
2002.11.21
Label для написания химических формул


3-69187
lejik
2002-11-01 09:29
2002.11.21
Хитрый SQL


1-69370
Трое из Леса
2002-11-10 11:51
2002.11.21
Help


1-69428
Shrek
2002-11-11 12:33
2002.11.21
DBCtrlGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский