Форум: "Сети";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизСохранение TWebBrowser Найти похожие ветки
← →
vakir77 (2004-08-05 15:14) [0]Здравствуйте,
подскажите в чем проблема, сохраняю содержимое TWebBrowser следующим способом:HTMLDocument := WebBrowser1.Document as IHTMLDocument;
PersistFile := HTMLDocument as IPersistFile;
PersistFile.Save(StringToOleStr("c:\HTMLFile.html"), System.True);
все работает хорошо.
пытаюсь сохранить через переменную:htmllink:="C:\Save\SavedFile.html";
HTMLDocument := WebBrowser1.Document as IHTMLDocument;
PersistFile := HTMLDocument as IPersistFile;
PersistFile.Save(StringToOleStr(htmllink), System.True);
страница не сохраняется.
← →
VID © (2004-08-05 20:14) [1]function WB_SaveHTMLCode(WebBrowser: TWebBrowser; const FileName: TFileName): Boolean;
var
ps: IPersistStreamInit;
fs: TFileStream;
sa: IStream;
begin
Result := False;
IF WebBrowser.Document = nil then exit;
ps := WebBrowser.Document as IPersistStreamInit;
fs := TFileStream.Create(FileName, fmCreate);
try
sa := TStreamAdapter.Create(fs, soReference) as IStream;
Result := Succeeded(ps.Save(sa, True));
finally
fs.Free;
end;
end;
function WB_GetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
var
ps: IPersistStreamInit;
ss: TStringStream;
sa: IStream;
s: string;
begin
ps := WebBrowser.Document as IPersistStreamInit;
s := "";
ss := TStringStream.Create(s);
try
sa := TStreamAdapter.Create(ss, soReference) as IStream;
Result := Succeeded(ps.Save(sa, True));
if Result then ACode.Add(ss.Datastring);
finally
ss.Free;
end;
end;
← →
ИМХО © (2004-08-05 23:25) [2]Кстати, кто знает, как сохранить при помощи TWebBrowser ВСЮ страницу (с картинками, стилями, скриптами) на диск?
← →
vakir77 (2004-08-06 14:22) [3]т.е в веб-архиве mht, интересный вопрос
← →
ИМХО © (2004-08-06 20:29) [4]Не обязательно в mht.
У MS IE есть четыре опции сохранения:
1. Web Page, complete
2. Web Archive, single file
3. Web Page, HTML only
4. Text file
Интересует первая опция.
← →
VID © (2004-08-07 13:38) [5]ИМХО © (06.08.04 20:29) [4]
1. юзаем EmbeddedWB
2. вызываем метод SaveDialog - получаем стандартное диалоговое окно сохранения веб-страницы
← →
ИМХО © (2004-08-07 15:59) [6]1. EmbeddedWB умеет сохранять полностью веб-страницу?
2. А вот это нежелательно, все должно автоматизировано.
← →
VID © (2004-08-07 16:19) [7]ИМХО © (07.08.04 15:59) [6]
Да умеет, точно так, как это делает сам IE. Да блин ведь по сути что IE что EmbeddedWB - один чёрт, всё от одного ActiveX пашет.
А насчёт второго... ну наверняка есть метод автоматизированного сохранения, без диалогового окна.
← →
ИМХО © (2004-08-08 00:42) [8]2. Если есть, то где он?
← →
VID © (2004-08-08 12:09) [9]ИМХО © (08.08.04 00:42) [8]
А вот этого я не знаю.
Спроси nikkie или Ihor Osov"yak.
← →
nikkie © (2004-08-08 13:48) [10]старая тема:
SaveHTMLSourceToFile
syte_ser78 © (05.02.04 15:03)
Сохраняет загруженную в twebbrowser страницу в HTM
Можно ли както сохранить в MHT ?
--------------------------------------------------------------------------------
[1] Delirium © (05.02.04 15:24)
ShowMessage(Variant(WebBrowser1.Document).body.innerHTML);
--------------------------------------------------------------------------------
[2] syte_ser78 © (05.02.04 16:09)
Это конечно здорово. только какое отношение оно имеет к MHT ???
--------------------------------------------------------------------------------
[3] y-soft © (05.02.04 18:06)
http://www.chilkatsoft.com/ChilkatMht.asp
Только платно :)
А вообще-то спецификация тут: http://www.ietf.org/rfc/rfc2557.txt
--------------------------------------------------------------------------------
[4] nikkie © (05.02.04 20:51)
>Только платно :)
и на чем только люди деньги не пытаются делать... :)
можно попытаться сделать это, выполнив команду OLECMDID_SAVEAS, но будет выскакивать диалог. по идее, диалоги должны одключаться параметром
OLECMDEXECOPT_DONTPROMPTUSER и явным указанием параметров в vaIn, но не всегда это получается. умельцы предлагают послать в окошко нажатия клавиш, см. например,
http://groups.google.com/groups?hl=ru&lr=&ie=UTF-8&oe=UTF-8&threadm=3c714968%241_1%40dnews&rnum=9&prev=/groups%3Fhl%3Dru %26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26q%3DOLECMDID_SAVEAS%2BWebBrowser%2Bmht
но как-то это коряво. если уж не получается через команды WB, то более разумным выглядит такой пример, который тоже нашелся в гугле:
CDO:
IMessage->CreateMHTMLBody(_bstr_t("http://www.northernlight.com"),
cdoSuppressAll,
_bstr_t(""),
_bstr_t(""));
IMessage->GetStream(&pStm);
Stream->SaveToFile(L"c:\\temp\\test.mht",adSaveCreateOverWrite);
← →
ИМХО © (2004-08-08 19:52) [11]Этот способ через CDO я знаю. Только на моей машине он не работает (программа в run-time дает "Ошибку синтаксиса" на CreateMHTMLBody)
Может, причина в том, что у меня не установлен MS Exchange?
← →
nikkie © (2004-08-09 01:50) [12]тогда ветка не получила продолжения и вариант с CDO не был обсужден. честно говоря, мне непонятно, кто CDO может ставить и какие его версии существуют в природе. у меня на win2k кроме "Microsoft CDO for Windows 2000 Library (Version 1.0)" есть еще "Microsoft CDO for NTS 1.2 Library (Version 1.2)" - но она совсем не та... может быть, разница в версиях и приводит к ошибке Invalid syntax.
собственно, я этот пример тогда даже не пробовал. сейчас вот попробовал - уменя работает, но результат совсем не тот, который ожидался. картинки он не сохраняет в mht...uses
ADODB_TLB, CDO_TLB;
procedure TForm1.Button1Click(Sender: TObject);
var
Msg: IMessage;
Stream: _Stream;
begin
Msg := CreateComObject(CLASS_Message) as IMessage;
Msg.CreateMHTMLBody("http://www.ya.ru", cdoSuppressAll, "", "");
Stream := Msg.GetStream;
Stream.SaveToFile("d:\test.mht", adSaveCreateOverWrite);
end;
поэтому мораль - с CDO не получится. надо либо сохранять с помощью OLECMDID_SAVEAS и давить диалог, например, посылкой нажатий клавиш, либо написать свой собственный генератор mht.
← →
ИМХО © (2004-08-09 08:27) [13]Я пользовался CDO немного иначе, но так же с отрицательным результатом:
function SaveToMHT(const AUrl, AFileName: string;
AShowErrorMessage: boolean = false): boolean;
var oMSG, oConfig: OleVariant;
sFileName: string;
Retvar: boolean;
begin
sFileName := ChangeFileExt(AFileName, ".mht");
DeleteFile(sFileName);
try
oConfig := CreateOleObject("CDO.Configuration");
oMSG := CreateOleObject("CDO.Message");
oMSG.Configuration := oConfig;
oMSG.CreateMHTMLBody(WideString(AUrl));
oMSG.GetStream.SaveToFile(sFileName);
Retvar := true;
except
on E: Exception do begin
if AShowErrorMessage then MessageDlg(E.Message, mtError, [mbOk], 0);
Retvar := false;
end;
end;
oMSG := VarNull;
oConfig := VarNull;
Result := Retvar;
end;
← →
nikkie © (2004-08-09 13:20) [14]>но так же с отрицательным результатом
я попросил бы... у меня все работает, так что не надо обобщать.
понятно теперь, почему у тебя вылетал Invalid Syntax.
конечно - используешь поздное связывание и вызываешь CreateMHTMLBody с неправильным количеством параметров. при компиляции все нормально, а в run-time получаешь ошибку.
← →
ИМХО © (2004-08-09 15:18) [15]У меня и этот код давал ошибку, так что не надо ля-ля:
procedure SaveToMHT(const URL, DestFileName: string);
var
Msg: IMessage;
Conf: IConfiguration;
Stream : _Stream;
begin
Msg := CoMessage.Create;
Conf := CoConfiguration.Create;
Msg.Configuration := Conf;
Msg.CreateMHTMLBody(URL, cdoSuppressNone, "", "");
Stream := Msg.GetStream;
Stream.SaveToFile(DestFileName, adSaveCreateOverWrite);
end;
Файл CDO_TLB.pas у меня в каталоге проекта
procedure CreateMHTMLBody(const URL: WideString; Flags: CdoMHTMLFlags;
const UserName: WideString; const Password: WideString); safecall;
и не смог бы скомпилить код с неверным кол-вом параметров
← →
nikkie © (2004-08-09 15:41) [16]у меня этот код также работает. в гугле есть несколько жалоб на Invalid Syntax при вызове CreateMHTMLBody, но ответов я не вижу.
какая у тебя версия OS, версия cdosys.dll и т.п.?
PS по поводу того, что "с CDO не получится" - это я дурканул. надо было читать описание флагов для CreateMHTMLBody. с cdoSuppressNone все картинки сохраняются в mht.
← →
ИМХО © (2004-08-09 18:21) [17]Windows 98 Second Edition
cdosys.dll вообще нет на диске. Думаю, причина в этом.
Хотя CLSIDFromProgID(PWideChar(WideString("CDO.Configuration")), ClassID) возвращает S_OK (и для CDO.Message возвращает тоже самое).
В общем, ничего не понимаю...
← →
nikkie © (2004-08-10 00:58) [18]для того, чтобы код из [15] компилировался, у тебя должно быть CDO_TLB в uses. загляни в него, посмотри, на основе какой type library он был сгенерен.
← →
ИМХО © (2004-08-10 04:13) [19]Я его не создавал, уже взял готовым:
// Type Lib: C:\WINNT\system32\cdosys.dll (1)
// IID\LCID: {CD000000-8B95-11D1-82DB-00C04FB1625D}\0
// Helpfile: C:\WINNT\system32\cdosys.chm
// DepndLst:
// (1) v2.0 stdole, (C:\WINNT\System32\Stdole2.tlb)
// (2) v2.5 ADODB, (C:\Program Files\Common Files\System\ADO\msado25.tlb)
// (3) v4.0 StdVCL, (C:\WINNT\System32\STDVCL40.DLL)
← →
nikkie © (2004-08-10 15:18) [20]1. в твоем CDO_TLB.pas такое значение?
CLASS_Message: TGUID = "{CD000001-8B95-11D1-82DB-00C04FB1625D}";
2. что написано в реестре в
HKEY_CLASSES_ROOT\CLSID\{CD000001-8B95-11D1-82DB-00C04FB1625D}\InprocServer32 ?
3. Project/Import Type Library - там есть название типа Microsoft CDO?
← →
Piter © (2004-08-10 15:29) [21]ИМХО © (05.08.04 23:25) [2]
Кстати, кто знает, как сохранить при помощи TWebBrowser ВСЮ страницу (с картинками, стилями, скриптами) на диск?
между прочим ты создавал ветку на такую тему. Я тебе пытался отвечать, только ты видимо забил на собственную ветку. Очень странно.
← →
nikkie © (2004-08-10 16:33) [22]>Piter
ну у тебя же все ходы записаны. повторись, мы с интересом послушаем.
← →
Piter © (2004-08-10 17:14) [23]nikkie © (10.08.04 16:33) [22]
а ты уже все сказал.
← →
Piter © (2004-08-10 17:14) [24]я вовсе не собираюсь с тобой тягаться в знании WebBroser :)))
← →
ИМХО © (2004-08-10 18:30) [25]
> Piter © (10.08.04 15:29) [21]
> ИМХО © (05.08.04 23:25) [2]
> Кстати, кто знает, как сохранить при помощи TWebBrowser
> ВСЮ страницу (с картинками, стилями, скриптами) на диск?
>
> между прочим ты создавал ветку на такую тему. Я тебе пытался
> отвечать, только ты видимо забил на собственную ветку. Очень
> странно.
Сорри, наверное, прозевал. Повтори, плиз.
З.Ы. Вообще было бы классно получать ответы на свою ветку по почте...
← →
ИМХО © (2004-08-10 18:48) [26]
> nikkie © (10.08.04 15:18) [20]
> 1. в твоем CDO_TLB.pas такое значение?
> CLASS_Message: TGUID = "{CD000001-8B95-11D1-82DB-00C04FB1625D}";
Так точно.
> 2. что написано в реестре в
> HKEY_CLASSES_ROOT\CLSID\{CD000001-8B95-11D1-82DB-00C04FB1625D}\InprocServer32
> ?
Там две подветки:
(По умолчанию) - C:\PROGRA~1\COMMON~1\MICROS~1\CDO\CDOEX.DLL
ThreadingModel - Both
> 3. Project/Import Type Library - там есть название типа
> Microsoft CDO?
Microsoft CDO For Exchange 2000 Library (Version 1.0)
← →
nikkie © (2004-08-10 19:30) [27]>Piter
да никто ни с кем не тягается... тем более, что CDO к WebBrowser отношения не имеет. если бы было еще какие-то идеи, то было бы интересно их услыщать. а пока CDO выглядит рабочим вариантом, но он не везде установлен.
Collaboration Data Objects (CDO) for Microsoft® Windows® 2000 (Cdosys.dll), which implements the 2.0 version of the Collaboration Data Objects API specification, is a Component Object Model (COM) component designed to simplify writing programs that create or manipulate Internet messages. CDO for Windows 2000 is one in a suite of collaborative COM components referred to collectively as CDO. CDO for Windows 2000 is an integral part of the Windows 2000 series of operating systems.
я пока встречал упоминание cdonts.dll - CDO for NTS 1.2 (MSDN говорит, что его устанавливает Exchange 5.5 или подмножество CDO 1.2 может установить IIS 4.0, что видимо и случилось в моем случае), cdosys.dll - CDO for Windows 2000 (цитата выше говорит, что это версия 2.0), cdoex.dll - CDO for Exchange 2000. интерфейсы CDO 1.2 и 2.0 совсем разные.
Microsoft Corporation recognizes that developers need an object library providing greater functionality than that available in the Active Messaging 1.1 library, which shipped with Microsoft® Exchange 5.0. Developers need objects that support capabilities beyond simple messaging and into the areas of calendaring, collaboration, and workflow. Such capabilities can simplify the development of heavy-duty resource-scheduling applications requiring information to be displayed through a calendar.
In response, Microsoft has replaced its Active Messaging objects with Collaboration Data Objects (CDOs). These CDOs are available in a library known as CDO 1.2, which replaces the Active Messaging object library version 1.1 and ships with Exchange 5.5. One of the library’s key features is that applications created with Active Messaging 1.1 can run unchanged in a CDO 1.2 environment. Also available, for developers working in the Internet Information Server 4.0 environment, is a subset library of CDO 1.2 known as Collaboration Data Objects for Microsoft Windows NT® Server.
хотелось бы понять, что там установлено у ИМХО, откуда оно взялось и почему объект создается, но вызов его метода приводит к ошибке.
для версий OS ниже w2k CDO вероятно установлено не будет. опять же, нет уверенности, что Microsoft в будущих версиях не выкинет CDO, как выкинула Active Messaging. поэтому мне кажется, что для независимых desktop-приложений mht файл лучше делать руками (или, может, TIdMessage его сможет записать).
← →
nikkie © (2004-08-10 19:34) [28]>(По умолчанию) - C:\PROGRA~1\COMMON~1\MICROS~1\CDO\CDOEX.DLL
>Microsoft CDO For Exchange 2000 Library (Version 1.0)
что-то я не понял, откуда это взялось. ты же писал:
>Может, причина в том, что у меня не установлен MS Exchange?
неужто перенес файлик и сам его зарегистрировал?
← →
ИМХО © (2004-08-10 19:39) [29]Нет, это, видимо, сделал MS Office XP при установке. Но файла cdosys.dll у меня нет.
← →
ИМХО © (2004-08-10 19:41) [30]
> или, может, TIdMessage его сможет записать).
Индаевский TIdMessage сможет его записать, если у него под руками будут все файлы. А пока загвоздка состоит в том, чтобы выкачать все связанные с html-страницей файлы (коих может быть туева хуча).
← →
nikkie © (2004-08-10 19:56) [31]перебрать теги в документе, выцепить ссылки на внешние файлы, получить эти файлы (из кеша или скачав, если в кеше их нет - URLDownloadToFile или RetrieveUrlCacheEntryFile), сохранить локально, заменить ссылки в документе. а никто и не говорил, что это будет просто.
как иначе? OLECMDID_SAVEAS + перехват открывающегося диалога (перехват WinAPI или хук), насильное его закрытие.
странно и обидно, что не работает OLECMDID_SAVEAS с флагом OLECMDEXECOPT_DONTPROMPTUSER, но что делать...
← →
ИМХО © (2004-08-10 21:07) [32]А как будет выглядеть код, в котором сохранение страницы (complete) осуществляется при помощи TWebBrowser? (мне почему-то думается, что это лучший способ, MS IE установлен везде).
А уж насильно то окно мы прикроем :)
← →
Piter © (2004-08-10 22:15) [33]Хоть бы предудущую свою ветку посмотрел - http://delphimaster.net/view/6-1087974793/
← →
nikkie © (2004-08-10 22:56) [34]>[32] ИМХО
ссылка приведена в [4]
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.041 c