Страница 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;