QueryInterface - не получается

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

Есть такая штука:

Код: Выделить всё

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;
Помогите продолжить код, чтобы получилось как и первом варианте
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Так не подойдёт?

Код: Выделить всё

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.
Даже самый дурацкий замысел можно воплотить мастерски
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

Ты же тоже самое написал, ну да ладно, меня интересует как дальше к item(i).document.body.innerHTML; обращаться через QueryInterface
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Ошибка когда Frames.item(i).document = $00000000
Разве так нельзя проверить:

Код: Выделить всё

 
  if Assigned(Frames.item(i).document) then
    ...
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

Нельзя
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Ты же тоже самое написал, ну да ладно, меня интересует как дальше к 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
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

Код: Выделить всё

Т.е. у Frames.Item(i) надо запросить интерфейс IHTMLDocument 
Далее, проверив доступность, делать с этим интерфейсом все что угодно. В т.ч. XXX.body.innerHTML
Это я понимаю, моя проблема заключется в том, что я не могу получить Frames.Item(i), а Frames.Length работает
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Так должно работать:

Код: Выделить всё

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;
Ответить