Форум: "Основная";
Текущий архив: 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.49 MB
Время: 0.012 c