Internet explorer
От: Аноним  
Дата: 25.05.04 08:38
Оценка:
нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.

как это сделать?
Re: Internet explorer
От: _silent Россия http://www.bezhetsk.ru
Дата: 25.05.04 08:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.


А>как это сделать?


А не легче ли сохранить этот AnsiString во временный файл с расширением .html, да запустить его ShellExecute'ом или WinExec'ом...
Я думаю, что легче...
Re: Internet explorer
От: TObject Россия  
Дата: 25.05.04 08:44
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.


А>как это сделать?

ShellExecute(GetDesktopWindow(),'open',PChar('http:\\Path\xxxxxx.htm'),nil,nil,SW_SHOWNORMAL)
Тока это для browsera по умолчанию
... << RSDN@Home 1.1.3 stable >>
Re[2]: Internet explorer
От: Аноним  
Дата: 25.05.04 08:48
Оценка:
Здравствуйте, _silent, Вы писали:

_>Здравствуйте, Аноним, Вы писали:


А>>нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.


А>>как это сделать?


_>А не легче ли сохранить этот AnsiString во временный файл с расширением .html, да запустить его ShellExecute'ом или WinExec'ом...

_>Я думаю, что легче...

да...так легче

а если мне надо чтоб эксплорер запускался в окне программы?
как это реализовать без cppwebbrowsera?
Re[3]: Internet explorer
От: Ihor Osovyak Украина  
Дата: 07.06.04 00:17
Оценка:
Здравствуйте, Аноним, Вы писали:



А>>>как это сделать?


_>>А не легче ли сохранить этот AnsiString во временный файл с расширением .html, да запустить его ShellExecute'ом или WinExec'ом...

_>>Я думаю, что легче...

А>да...так легче


А>а если мне надо чтоб эксплорер запускался в окне программы?


Если имеется ввиду полноценный IE — в принцыпе невозможно. Как невозможно в "своем окне" запустить иной процесс.
Если имеется ввиду активИкс от IE — ради бога — TWebBrowser (D) или как его там в билдере, cppWebBrowser..



> А>>>нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.


Способов много. Один из вариантов:


var 
  iWB: IWebBrowser2;
  ov: olevariant; 
  v: Variant;
  iDoc: IHtmlDocument2;
...

 iWB := CreateOleObject('InternetExplorer.Application.1') as IWebBrowser2;

 ov :=  'about:blank';
 iWB.Navigate(ov, emptyparam, emptyparam, emptyparam, emptyparam);

 while iWB.ReadyState <> 4 do Application.ProcessMessages;

 iDoc:= iWB.DefaultInterface.Document as IHtmlDocument2;
  
 v := VarArrayCreate([0, 0], varVariant);
 v[0] := aText; // Here's your HTML string
 
 iDoc.Write(PSafeArray(TVarData(v).VArray));
 iDoc.Close;



Ps. Писалось по памяти, возможно есть опячатки, но не искажающее смысла решения.


...
Re[4]: Internet explorer
От: Romkin  
Дата: 07.06.04 06:53
Оценка:
Здравствуйте, Ihor Osovyak, Вы писали:

А>>а если мне надо чтоб эксплорер запускался в окне программы?


IO>Если имеется ввиду полноценный IE — в принцыпе невозможно. Как невозможно в "своем окне" запустить иной процесс.

IO>Если имеется ввиду активИкс от IE — ради бога — TWebBrowser (D) или как его там в билдере, cppWebBrowser..

>> А>>>нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.


IO>Способов много. Один из вариантов:


Да просто http://members.shaw.ca/iedelphi/webbrowser.htm
Или просто поискать, уж чего полно, так это решений
Re[5]: Internet explorer
От: Ihor Osovyak Украина  
Дата: 07.06.04 08:04
Оценка: 39 (1)
Здравствуйте, Romkin, Вы писали:

R>Здравствуйте, Ihor Osovyak, Вы писали:


А>>>а если мне надо чтоб эксплорер запускался в окне программы?


IO>>Если имеется ввиду полноценный IE — в принцыпе невозможно. Как невозможно в "своем окне" запустить иной процесс.

IO>>Если имеется ввиду активИкс от IE — ради бога — TWebBrowser (D) или как его там в билдере, cppWebBrowser..

>>> А>>>нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.


IO>>Способов много. Один из вариантов:


R>Да просто http://members.shaw.ca/iedelphi/webbrowser.htm

R>Или просто поискать, уж чего полно, так это решений


Решений то много. Но. См. то же http://members.shaw.ca/iedelphi/webbrowser.htm,
см. ответ на Q: How do I load a string into the WebBrowser without Navigating to a file?

Делаем тестовое приложение. Запускаем в цыкле несколько десятков раз. Теперь берем аналог из моего пред. постинга. Тоже запускаем в цыкле несколько десятков раз. Наблюдаем за количеством занятой памяти. Делаем выводы о наличии утечек памяти в варианте от http://members.shaw.ca/iedelphi/webbrowser.htm и отсутствием такого в моем варианте.

Ключевое различие:
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
iDoc:= iWB.DefaultInterface.Document as IHtmlDocument2;

Дело здесь в одной довольно малоизвестной ошибке в vcl, связаннной с подсчетом использований интерфейсных ссылок, а именно в TOleControl.GetIDispatchProp. Ошибка присутствует и в пятерке, и в шестерке. За D4, D7 говорить не буду — не смотрел.

При использовании фрагмента вида WebBrowser1.Document происходит вызов TOleControl.GetIDispatchProp,
при работе в стиле WebBrowser1.DefaultInterface.Document — не происходит.

Тема несколько раз обговаривалась в разных форумах.

Суть ошибки — реализация TOleControl.GetIDispatchProp провоцирует компилятор не генерировать один необходимый _Release. Компилятор он правильно работает в данном случае, реализация метода уж очень хитра. Две строчки кода и такая красивая ошибка.



function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
var
  Temp: TVarData;
begin
  GetProperty(Index, Temp);
  Result := IDispatch(Temp.VDispatch);
end;



Для кода, делающего присваивание интерфейсной ссылки результату компилятор неявно сгенерирует _AddRef. И правильно сделает.
В момент ухода из области видимости Temp неявный вызов _Release генерироваться не будет — что тоже правильно — откуда компилятору знать, что в Temp который TVarData в этот момент живет интерфейсная ссылка? А как результат — имеем один лишний _AddRef. И как следствие — соотв. IHtmlDocument2 будет жить в памяти долго, несмотря на то, что он давным давно выгружен из броузера и никому уже не нужен. Будет жить до последних мгновений жызни программы. Слава богу, что имеем дело с inproc server ..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.