нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.
как это сделать?
Здравствуйте, <Аноним>, Вы писали:
А>нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.
А>как это сделать?
ShellExecute(GetDesktopWindow(),'open',PChar('http:\\Path\xxxxxx.htm'),nil,nil,SW_SHOWNORMAL)
Тока это для browsera по умолчанию
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, Аноним, Вы писали:
А>>>как это сделать?
_>>А не легче ли сохранить этот 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. Писалось по памяти, возможно есть опячатки, но не искажающее смысла решения.
...
Здравствуйте, Ihor Osovyak, Вы писали:
А>>а если мне надо чтоб эксплорер запускался в окне программы?
IO>Если имеется ввиду полноценный IE — в принцыпе невозможно. Как невозможно в "своем окне" запустить иной процесс.
IO>Если имеется ввиду активИкс от IE — ради бога — TWebBrowser (D) или как его там в билдере, cppWebBrowser..
>> А>>>нужно программно запустить IE, передав ему HTML для отображения, который хранится в AnsiString.
IO>Способов много. Один из вариантов:
Да просто
http://members.shaw.ca/iedelphi/webbrowser.htm
Или просто поискать, уж чего полно, так это решений
Здравствуйте, 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

..