збереження twebbrowser

збереження TWebBrowser

Вітаю,
підкажіть у чому проблема, зберігаю вміст TWebBrowser наступним способом:
# XA0; HTMLDocument: = WebBrowser1.Document as IHTMLDocument;
# XA0; PersistFile # XA0;: = HTMLDocument as IPersistFile;
# XA0; PersistFile.Save (StringToOleStr ( "c: \ HTMLFile.html"), System.True);
все працює добре.

намагаюся зберегти через змінну:
htmllink: = "C: \ Save \ SavedFile.html";
HTMLDocument: = WebBrowser1.Document as IHTMLDocument;
PersistFile # XA0;: = HTMLDocument as IPersistFile;
PersistFile.Save (StringToOleStr (htmllink), System.True);
сторінка не зберігається.

function WB_SaveHTMLCode (WebBrowser: TWebBrowser; const FileName: TFileName): Boolean;
var
# XA0; ps: IPersistStreamInit;
# XA0; fs: TFileStream;
# XA0; sa: IStream;
begin
# XA0; Result: = False;
# XA0; IF WebBrowser.Document = nil then exit;
# XA0; ps: = WebBrowser.Document as IPersistStreamInit;
# XA0; fs: = TFileStream.Create (FileName, fmCreate);
# XA0; try
# XA0; # XA0; sa: = TStreamAdapter.Create (fs, soReference) as IStream;
# XA0; # XA0; Result: = Succeeded (ps.Save (sa, True));
# XA0; finally
# XA0; # XA0; fs.Free;
# XA0; end;
end;

function WB_GetHTMLCode (WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
var
# XA0; ps: IPersistStreamInit;
# XA0; ss: TStringStream;
# XA0; sa: IStream;
# XA0; s: string;
begin
# XA0; ps: = WebBrowser.Document as IPersistStreamInit;
# XA0; s: = "";
# XA0; ss: = TStringStream.Create (s);
# XA0; try
# XA0; # XA0; sa: = TStreamAdapter.Create (ss, soReference) as IStream;
# XA0; # XA0; Result: = Succeeded (ps.Save (sa, True));
# XA0; # XA0; if Result then ACode.Add (ss.Datastring);
# XA0; finally
# XA0; # XA0; ss.Free;
# XA0; end;
end;

До речі, хто знає, як зберегти за допомогою TWebBrowser ВРЮ сторінку (з картинками, стилями, скриптами) на диск?

тобто в веб-архіві mht, цікаве питання

Не обов'язково в mht.

У MS IE є чотири опції збереження:
1. Web Page, complete
2. Web Archive, single file
3. Web Page, HTML only
4. Text file

Цікавить перша опція.

1. EmbeddedWB вміє зберігати повністю веб-сторінку?

2. А ось це небажано, все повинно автоматизовано.

А щодо другого. ну напевно є метод автоматизованого збереження, без діалогового вікна.

2. Якщо є, то де він?

А ось цього я не знаю.
Запитай nikkie або Ihor Osov "yak.

можна спробувати зробити це, виконавши команду OLECMDID_SAVEAS, але буде вискакувати діалог. по ідеї, діалоги повинні одключаться параметром
OLECMDEXECOPT_DONTPROMPTUSER і явним зазначенням параметрів в vaIn, але не завжди це виходить. умільці пропонують послати в віконце натискання клавіш, див. наприклад,

але якось це кострубато. якщо вже не виходить через команди WB, то більш розумним виглядає такий приклад, який теж знайшовся в гуглі:

Цей спосіб через CDO я знаю. Тільки на моїй машині він не працює (програма в run-time дає "Помилку синтаксису" на CreateMHTMLBody)

Може, причина в тому, що у мене не встановлений MS Exchange?

власне, я цей приклад тоді навіть не пробував. Зараз ось спробував - у мене працює, але результат зовсім не той, який очікувався. картинки він не зберігає в mht.

uses
# XA0; ADODB_TLB, CDO_TLB;

тому мораль - з CDO не вийде. треба або зберігати за допомогою OLECMDID_SAVEAS і тиснути діалог, наприклад, посилкою натискань клавіш, або написати свій власний генератор mht.

Я користувався CDO трохи інакше, але так само з негативним результатом:

function SaveToMHT (const AUrl, AFileName: string;
# XA0; AShowErrorMessage: boolean = false): boolean;
var oMSG, oConfig: OleVariant;
# XA0; sFileName: string;
# XA0; Retvar: boolean;
begin
# XA0; sFileName: = ChangeFileExt (AFileName, ".mht");
# XA0; DeleteFile (sFileName);

# XA0; try
# XA0; # XA0; oConfig: = CreateOleObject ( "CDO.Configuration");
# XA0; # XA0; oMSG: = CreateOleObject ( "CDO.Message");
# XA0; # XA0; oMSG.Configuration: = oConfig;
# XA0; # XA0; oMSG.CreateMHTMLBody (WideString (AUrl));
# XA0; # XA0; oMSG.GetStream.SaveToFile (sFileName);
# XA0; # XA0; Retvar: = true;
# XA0; except
# XA0; # XA0; on E: Exception do begin
# XA0; # XA0; # XA0; if AShowErrorMessage then MessageDlg (E.Message, mtError, [mbOk], 0);
# XA0; # XA0; # XA0; Retvar: = false;
# XA0; # XA0; end;
# XA0; end;

# XA0; oMSG: = VarNull;
# XA0; oConfig: = VarNull;

> Але так само з негативним результатом
я попросив би. у мене все працює, так що не треба узагальнювати.

зрозуміло тепер, чому у тебе вилітав Invalid Syntax.
звичайно - використовуєш пізніше зв'язування і викликаєш CreateMHTMLBody з неправильною кількістю параметрів. при компіляції все нормально, а в run-time отримуєш помилку.

У мене і цей код давав помилку, так що не треба ля-ля:

procedure SaveToMHT (const URL, DestFileName: string);
var
# XA0; Msg: IMessage;
# XA0; Conf: IConfiguration;
# XA0; Stream. _Stream;
begin
# XA0; Msg: = CoMessage.Create;
# XA0; Conf: = CoConfiguration.Create;
# XA0; Msg.Configuration: = Conf;
# XA0; Msg.CreateMHTMLBody (URL, cdoSuppressNone, "", "");
# XA0; Stream: = Msg.GetStream;
# XA0; Stream.SaveToFile (DestFileName, adSaveCreateOverWrite);
end;

Файл CDO_TLB.pas у мене в каталозі проекту
# XA0; # XA0; procedure CreateMHTMLBody (const URL: WideString; Flags: CdoMHTMLFlags;
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; const UserName: WideString; const Password: WideString); safecall;

і не зміг би скомпіліть код з невірним кол-вом параметрів

у мене цей код також працює. в гуглі є кілька скарг на Invalid Syntax при виклику CreateMHTMLBody, але відповідей я не бачу.

яка в тебе версія OS, версія cdosys.dll і т.п.?

Windows 98 Second Edition

cdosys.dll взагалі немає на диску. Думаю, причина в цьому.

Хоча CLSIDFromProgID (PWideChar (WideString ( "CDO.Configuration")), ClassID) повертає S_OK (і для CDO.Message повертає те ж саме).

Загалом, нічого не розумію.

для того, щоб код з [15] компілювався, у тебе має бути CDO_TLB в uses. заглянь в нього, подивися, на основі якої type library він був згенерувати.

Я його не створював, вже взяв готовим:

// Type Lib: C: \ WINNT \ system32 \ cdosys.dll (1)
// IID \ LCID: \ 0
// Helpfile: C: \ WINNT \ system32 \ cdosys.chm
// DepndLst:
// # XA0; (1) v2.0 stdole, (C: \ WINNT \ System32 \ Stdole2.tlb)
// # XA0; (2) v2.5 ADODB, (C: \ Program Files \ Common Files \ System \ ADO \ msado25.tlb)
// # XA0; (3) v4.0 StdVCL, (C: \ WINNT \ System32 \ STDVCL40.DLL)

1. в твоєму CDO_TLB.pas таке значення?
# XA0; CLASS_Message: TGUID = "";
2. що написано в реєстрі в
HKEY_CLASSES_ROOT \ CLSID \\ InprocServer32?
3. Project / Import Type Library - там є назва типу Microsoft CDO?

між іншим ти створював гілку на таку тему. Я тобі намагався відповідати, тільки ти мабуть забив на власну гілку. Дуже дивно.

> Piter
ну в тебе ж всі ходи записані. якби повторилася, ми з цікавістю послухаємо.

а ти вже все сказав.

я зовсім не збираюся з тобою змагатися в знанні WebBroser :)))

Соррі, напевно, прогавив. Повтори, плиз.

З.И. Взагалі було б класно отримувати відповіді на свою гілку поштою.

Там дві подветкой:
(За замовчуванням) - C: \ PROGRA


> 3. Project / Import Type Library - там є назва типу
> Microsoft CDO?

> Piter
та ніхто ні з ким не змагатися. тим більше, що CDO до WebBrowser відношення не має. якби було ще якісь ідеї, то було б цікаво їх услищать. а поки CDO виглядає робочим варіантом, але він не скрізь встановлено.

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 його зможе записати).

> (За замовчуванням) - C: \ PROGRA

щось я не зрозумів, звідки це взялося. ти ж писав:

> Може, причина в тому, що у мене не встановлений MS Exchange?

невже переніс файлик і сам його зареєстрував?

Ні, це, мабуть, зробив MS Office XP при установці. Але файлу cdosys.dll у мене немає.


> Або, може, TIdMessage його зможе записати).

Індаевскій TIdMessage зможе його записати, якщо у нього під руками будуть всі файли. А поки заковика полягає в тому, щоб викачати все пов'язані з html-сторінкою файли (яких може бути туєва хуча).

перебрати теги в документі, вицепіть посилання на зовнішні файли, отримати ці файли (з кеша або скачавши, якщо в кеші їх немає - URLDownloadToFile або RetrieveUrlCacheEntryFile), зберегти локально, замінити посилання в документі. а ніхто і не говорив, що це буде просто.

як інакше? OLECMDID_SAVEAS + перехоплення відкривається діалогу (перехоплення WinAPI або хук), насильницьке його закриття.

дивно і прикро, що не працює OLECMDID_SAVEAS з прапором OLECMDEXECOPT_DONTPROMPTUSER, але що робити.

А як буде виглядати код, в якому збереження сторінки (complete) здійснюється за допомогою TWebBrowser? (Мені чомусь думається, що це кращий спосіб, MS IE встановлений всюди).

А вже насильно то вікно ми прикриємо :)

Схожі статті