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

Вниз

Как отлавливать события для IWebBrowser2?   Найти похожие ветки 

 
Zelius ©   (2003-01-14 13:33) [0]

Я понял, что нужно использовать IConnectionPoint, но у меня нету опыта в создании такий конструкций :( Помогите примером или ссылкой на статью! Спасибо!


 
Ihor Osov'yak ©   (2003-01-14 16:12) [1]

Вариант первый и основной. Подумать об использовании TWebBrowser или TInternetExplorer. И все проблемы исчезнут.

Если это не катит (немного поднапрягу фантазию и могу предположить, что Вы получили IWebBrowser2 от уже запущеной не Вами IE), то действительно - IConnectionPoint.

Примерно так:


<pre>
procedure TDWebBrowserEvents2.Connect (pSource : IUnknown);
var
pcpc : IConnectionPointContainer;
begin
Assert (pSource <> NIL);
try
OleCheck (pSource.QueryInterface (IConnectionPointContainer, pcpc));
OleCheck (pcpc.FindConnectionPoint (FSinkIID, F_CP));
OleCheck (F_CP.Advise (Self, FCookie));
F_Source := pSource;
except
raise Exception.Create (Format ("Unable to connect %s."#13"%s",
["TDWebBrowserEvents2", Exception (ExceptObject).Message]
));
end; { finally }
end;
</pre>


Понятно, что TDWebBrowserEvents2 должен имплементировать
IUnknown, IDispatch
ну и далее примерно так:

далее будет


 
Ihor Osov'yak ©   (2003-01-14 16:12) [2]



procedure BuildPositionalDispIds (pDispIds : PDispIdList; const dps : TDispParams);
var
i : integer;
begin
Assert (pDispIds <> NIL);

{ by default, directly arrange in reverse order }
for i := 0 to dps.cArgs - 1 do
pDispIds^ [i] := dps.cArgs - 1 - i;

{ check for named args }
if (dps.cNamedArgs <= 0) then Exit;

{ parse named args }
for i := 0 to dps.cNamedArgs - 1 do
pDispIds^ [dps.rgdispidNamedArgs^ [i]] := i;
end;



function TDWebBrowserEvents2.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
type
POleVariant = ^OleVariant;
var
dps : TDispParams absolute Params;
bHasParams : boolean;
pDispIds : PDispIdList;
iDispIdsSize : integer;

begin
Result := DISP_E_MEMBERNOTFOUND;

{ validity checks }
if (Flags AND DISPATCH_METHOD = 0) then
raise Exception.Create (
Format ("%s only supports sinking of method calls!", [ClassName]
));

{ build pDispIds array. this maybe a bit of overhead but it allows us to
sink named-argument calls such as Excel"s AppEvents, etc!
}
pDispIds := NIL;
iDispIdsSize := 0;
bHasParams := (dps.cArgs > 0);
if (bHasParams) then
begin
iDispIdsSize := dps.cArgs * SizeOf (TDispId);
GetMem (pDispIds, iDispIdsSize);
end; { if }

try
{ rearrange dispids properly }
if (bHasParams) then BuildPositionalDispIds (pDispIds, dps);

//SinkInvoke//
case DispId of
102 :
begin
DoStatusTextChange (dps.rgvarg^ [pDispIds^ [0]].bstrval);
Result := S_OK;
end;
108 :
begin
DoProgressChange (dps.rgvarg^ [pDispIds^ [0]].lval, dps.rgvarg^ [pDispIds^ [1]].lval);
Result := S_OK;
end;
105 :
begin
DoCommandStateChange (dps.rgvarg^ [pDispIds^ [0]].lval, dps.rgvarg^ [pDispIds^ [1]].vbool);
Result := S_OK;
end;
106 :
begin
DoDownloadBegin ();
Result := S_OK;
end;
104 :
begin
DoDownloadComplete ();
Result := S_OK;
end;
113 :
begin
DoTitleChange (dps.rgvarg^ [pDispIds^ [0]].bstrval);
Result := S_OK;
end;
112 :
begin
DoPropertyChange (dps.rgvarg^ [pDispIds^ [0]].bstrval);
Result := S_OK;
end;
250 :
begin
DoBeforeNavigate2 (IDispatch (dps.rgvarg^ [pDispIds^ [0]].dispval), POleVariant (dps.rgvarg^ [pDispIds^ [1]].pvarval)^, POleVariant (dps.rgvarg^ [pDispIds^ [2]].pvarval)^, POleVariant (dps.rgvarg^ [pDispIds^ [3]].pvarval)^, POleVariant (dps.rgvarg^ [pDispIds^ [4]].pvarval)^, POleVariant (dps.rgvarg^ [pDispIds^ [5]].pvarval)^, dps.rgvarg^ [pDispIds^ [6]].pbool^);
Result := S_OK;
end;
251 :
begin
DoNewWindow2 (IDispatch (dps.rgvarg^ [pDispIds^ [0]].pdispval^), dps.rgvarg^ [pDispIds^ [1]].pbool^);
Result := S_OK;
end;
252 :
begin
DoNavigateComplete2 (IDispatch (dps.rgvarg^ [pDispIds^ [0]].dispval), POleVariant (dps.rgvarg^ [pDispIds^ [1]].pvarval)^);
Result := S_OK;
end;
259 :
begin
DoDocumentComplete (IDispatch (dps.rgvarg^ [pDispIds^ [0]].dispval), POleVariant (dps.rgvarg^ [pDispIds^ [1]].pvarval)^);
Result := S_OK;
end;
253 :
begin
DoOnQuit ();
Result := S_OK;
end;
254 :
begin
DoOnVisible (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
255 :
begin
DoOnToolBar (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
256 :
begin
DoOnMenuBar (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
257 :
begin
DoOnStatusBar (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
258 :
begin
DoOnFullScreen (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
260 :
begin
DoOnTheaterMode (dps.rgvarg^ [pDispIds^ [0]].vbool);
Result := S_OK;
end;
end; { case }
//SinkInvokeEnd//
finally
{ free pDispIds array }
if (bHasParams) then FreeMem (pDispIds, iDispIdsSize);
end; { finally }
end;




 
Zelius ©   (2003-01-14 16:32) [3]

Большое спасибо!
Я уже нашел TDWebBrowserEvents2! Но все равно спасибо! :)



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

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

Наверх




Память: 0.48 MB
Время: 0.016 c
3-29727
asusfi
2003-02-18 17:22
2003.03.10
ТРАНЗАКЦИИ НА СЕРВЕРЕ


3-29734
Goffman
2003-02-19 08:50
2003.03.10
Midas. Открытие/Закрытие Dataset


1-29791
kat
2003-02-26 14:37
2003.03.10
Освобождение памяти


14-30067
Дмитрий К.К.
2003-02-21 06:30
2003.03.10
Именинники 21 февраля


3-29732
Max79
2003-02-19 11:20
2003.03.10
Хотелось бы реализовать сортировку по возрастанию и убыванию