![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение TWebBrowser [D7, WinXP]
vakir77 © (2004-08-05 15:14:00)Здравствуйте,
подскажите в чем проблема, сохраняю содержимое 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);
страница не сохраняется.
nikkie (2004-08-10 22:56:00) [1]>[32] ИМХО
ссылка приведена в [4]
Piter (2004-08-10 22:15:00) [2]Хоть бы предудущую свою ветку посмотрел - http://www.delphimaster.ru/cgi-bin/forum.pl?id=1087974793&n=4
ИМХО (2004-08-10 21:07:00) [3]А как будет выглядеть код, в котором сохранение страницы (complete) осуществляется при помощи TWebBrowser? (мне почему-то думается, что это лучший способ, MS IE установлен везде).
А уж насильно то окно мы прикроем :)
nikkie (2004-08-10 19:56:00) [4]перебрать теги в документе, выцепить ссылки на внешние файлы, получить эти файлы (из кеша или скачав, если в кеше их нет - URLDownloadToFile или RetrieveUrlCacheEntryFile), сохранить локально, заменить ссылки в документе. а никто и не говорил, что это будет просто.
как иначе? OLECMDID_SAVEAS + перехват открывающегося диалога (перехват WinAPI или хук), насильное его закрытие.
странно и обидно, что не работает OLECMDID_SAVEAS с флагом OLECMDEXECOPT_DONTPROMPTUSER, но что делать...
ИМХО (2004-08-10 19:41:00) [5]
> или, может, TIdMessage его сможет записать).
Индаевский TIdMessage сможет его записать, если у него под руками будут все файлы. А пока загвоздка состоит в том, чтобы выкачать все связанные с html-страницей файлы (коих может быть туева хуча).
ИМХО (2004-08-10 19:39:00) [6]Нет, это, видимо, сделал MS Office XP при установке. Но файла cdosys.dll у меня нет.
nikkie (2004-08-10 19:34:00) [7]>(По умолчанию) - C:\PROGRA~1\COMMON~1\MICROS~1\CDO\CDOEX.DLL
>Microsoft CDO For Exchange 2000 Library (Version 1.0)
что-то я не понял, откуда это взялось. ты же писал:
>Может, причина в том, что у меня не установлен MS Exchange?
неужто перенес файлик и сам его зарегистрировал?
nikkie (2004-08-10 19:30:00) [8]>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 его сможет записать).
ИМХО (2004-08-10 18:48:00) [9]
> 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)
ИМХО (2004-08-10 18:30:00) [10]
> Piter © (10.08.04 15:29) [21]
> ИМХО © (05.08.04 23:25) [2]
> Кстати, кто знает, как сохранить при помощи TWebBrowser
> ВСЮ страницу (с картинками, стилями, скриптами) на диск?
>
> между прочим ты создавал ветку на такую тему. Я тебе пытался
> отвечать, только ты видимо забил на собственную ветку. Очень
> странно.
Сорри, наверное, прозевал. Повтори, плиз.
З.Ы. Вообще было бы классно получать ответы на свою ветку по почте...
Piter (2004-08-10 17:14:00) [11]я вовсе не собираюсь с тобой тягаться в знании WebBroser :)))
Piter (2004-08-10 17:14:00) [12]nikkie © (10.08.04 16:33) [22]
а ты уже все сказал.
nikkie (2004-08-10 16:33:00) [13]>Piter
ну у тебя же все ходы записаны. повторись, мы с интересом послушаем.
Piter (2004-08-10 15:29:00) [14]ИМХО © (05.08.04 23:25) [2]
Кстати, кто знает, как сохранить при помощи TWebBrowser ВСЮ страницу (с картинками, стилями, скриптами) на диск?
между прочим ты создавал ветку на такую тему. Я тебе пытался отвечать, только ты видимо забил на собственную ветку. Очень странно.
nikkie (2004-08-10 15:18:00) [15]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?
ИМХО (2004-08-10 04:13:00) [16]Я его не создавал, уже взял готовым:
// 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 00:58:00) [17]для того, чтобы код из [15] компилировался, у тебя должно быть CDO_TLB в uses. загляни в него, посмотри, на основе какой type library он был сгенерен.
ИМХО (2004-08-09 18:21:00) [18]Windows 98 Second Edition
cdosys.dll вообще нет на диске. Думаю, причина в этом.
Хотя CLSIDFromProgID(PWideChar(WideString('CDO.Configuration')), ClassID) возвращает S_OK (и для CDO.Message возвращает тоже самое).
В общем, ничего не понимаю...
nikkie (2004-08-09 15:41:00) [19]у меня этот код также работает. в гугле есть несколько жалоб на Invalid Syntax при вызове CreateMHTMLBody, но ответов я не вижу.
какая у тебя версия OS, версия cdosys.dll и т.п.?
PS по поводу того, что "с CDO не получится" - это я дурканул. надо было читать описание флагов для CreateMHTMLBody. с cdoSuppressNone все картинки сохраняются в mht.
ИМХО (2004-08-09 15:18:00) [20]У меня и этот код давал ошибку, так что не надо ля-ля:
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;
и не смог бы скомпилить код с неверным кол-вом параметров