Форум: "Система";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
ВнизКак отлавливать события для 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c