Страница 1 из 1
QueryInterface - не получается
Добавлено: 09 дек 2005, 16:14
Blood_Magic
Есть такая штука:
Код: Выделить всё
Frames:=WebBrowser.OleObject.Document.Frames;
for i:=0 to Frames.Length-1 do
If Frames.item(i).name='...' then
s:=Frames.item(i).document.body.innerHTML;
Почти замечательно работает. Ошибка когда Frames.item(i).document = $00000000 в Delphi это проверить ни как не получается, есть вариант использовать:
Код: Выделить всё
WebBrowser.ControlInterface.Document.QueryInterface(IHTMLDocument2,iDoc);
if not assigned(iDoc) then Exit;
iDoc.QueryInterface(IHTMLDocument2,Frames);
if not assigned(Frames) then Exit;
Помогите продолжить код, чтобы получилось как и первом варианте
Добавлено: 10 дек 2005, 06:18
AiK
Так не подойдёт?
Код: Выделить всё
var Doc:IHTMLDocument2;
i:integer;
begin
Doc:= WebBrowser1.Document as IHTMLDocument2;
// то же самое, но через запрос интерфейса: WebBrowser1.Document.QueryInterface(IHTMLDocument2, Doc)
If Doc.frames <> nil then
for i:=0 to Doc.frames .Length-1 do
Что касается твоего примера, то я не понял, зачем ты дважды подряд запрашиваешь один и тот же интерфейс?
Достаточно одного раза, а дальше всё так же, как и в первом случае - обращаешься к свойству frames.
Добавлено: 10 дек 2005, 10:50
Blood_Magic
Ты же тоже самое написал, ну да ладно, меня интересует как дальше к item(i).document.body.innerHTML; обращаться через QueryInterface
Добавлено: 12 дек 2005, 14:28
Eugie
Ошибка когда Frames.item(i).document = $00000000
Разве так нельзя проверить:
Код: Выделить всё
if Assigned(Frames.item(i).document) then
...
Добавлено: 12 дек 2005, 14:59
Blood_Magic
Нельзя
Добавлено: 12 дек 2005, 15:44
Naeel Maqsudov
Ты же тоже самое написал, ну да ладно, меня интересует как дальше к item(i).document.body.innerHTML; обращаться через QueryInterface
Blood_Magic, Вам же было показано на примере
var Doc:IHTMLDocument2;
i:integer;
begin
Doc:= WebBrowser1.Document as IHTMLDocument2;
// то же самое, но через запрос интерфейса: WebBrowser1.Document.QueryInterface(IHTMLDocument2, Doc)
Что
Var X:ISomeinterface;
....
X:=Obj.InterfaceProperty;
Это то же самое, что
Obj.InterfaceProperty.QueryInterface(ISomeInterface,X);
Т.е. у Frames.Item(i) надо запросить интерфейс IHTMLDocument
Далее, проверив доступность, делать с этим интерфейсом все что угодно. В т.ч. XXX.body.innerHTML
Добавлено: 13 дек 2005, 14:36
Blood_Magic
Код: Выделить всё
Т.е. у Frames.Item(i) надо запросить интерфейс IHTMLDocument
Далее, проверив доступность, делать с этим интерфейсом все что угодно. В т.ч. XXX.body.innerHTML
Это я понимаю, моя проблема заключется в том, что я не могу получить Frames.Item(i), а Frames.Length работает
Добавлено: 13 дек 2005, 16:03
Eugie
Так должно работать:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var doc: IHTMLDocument2;
frm_col: IHTMLFramesCollection2;
win: IHTMLWindow2;
index: OleVariant;
s: String;
i: Integer;
begin
doc := wb.Document as IHTMLDocument2; // wb:TWebBrowser
frm_col := doc.Frames as IHTMLFramesCollection2;
for i:=0 to frm_col.Length-1 do
begin
index := OleVariant(i);
win := IUnknown(frm_col.item(index)) as IHTMLWindow2;
if Assigned(win.document) then begin
s:=doc.body.innerHTML;
{...}
end;
end;
end;