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

Вниз

Подключение к событиям 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
8-69449
Darlok
2002-05-15 15:57
2002.11.21
Прозрачные окна


3-69223
ТОлег
2002-11-01 16:46
2002.11.21
Можно ли в DBGrid произвести сортировку записей


3-69213
kva
2002-11-01 14:22
2002.11.21
ADOConnection Delphi 5. Проблемы с ConnectionTimeout


1-69354
Monak
2002-11-06 20:51
2002.11.21
Буфер обмена


3-69140
БОБ
2002-10-31 09:29
2002.11.21
SELECT...