Стоит такая задача. Как известно, если использовать метод Navigate интерфейса IWebBrowser2 загрузится соответствующий заданному URL ActiveX-документ. Нужно заставить WebBrowser сделать нечто аналогичное, но не используя URL, а имея данные документа в виде некоего буфера и, скажем, его тип MIME или расширение документа.
Здравствуйте staya, Вы писали:
S>Стоит такая задача. Как известно, если использовать метод Navigate интерфейса IWebBrowser2 загрузится соответствующий заданному URL ActiveX-документ. Нужно заставить WebBrowser сделать нечто аналогичное, но не используя URL, а имея данные документа в виде некоего буфера и, скажем, его тип MIME или расширение документа.
Можно изобрести свой URL-протокол и в его обработчике подсовывать IE свои данные. Единственное, надо будет придумать как по URL обработчик будет догадываться, где взять данные. Смотри Asynchronous Pluggable Protocols
AF>Можно изобрести свой URL-протокол и в его обработчике подсовывать IE свои данные. Единственное, надо будет придумать как по URL обработчик будет догадываться, где взять данные. Смотри Asynchronous Pluggable Protocols
Спасибо за идею. Посмотрю.
AF>Может проще во временный файл сохранить?
Несомненно, проще, но как раз-таки файлы использовать нельзя, в том и проблема.
Здравствуйте staya, Вы писали:
S>На самом деле, свой протокол не решит проблемы. Всё равно остается открытым вопрос — как загрузить данные в абстрактный ActiveX-документ?
А через Mapped файлы никак ?
Re[5]: ActiveX-документ в WebBrowser-е
От:
Аноним
Дата:
11.04.02 06:26
Оценка:
L>А через Mapped файлы никак ?
А как указывать URL? Создается ведь только handle файла, а не файл с путем.
Re[6]: ActiveX-документ в WebBrowser-е
От:
Аноним
Дата:
11.04.02 20:41
Оценка:
Так. WebBrowser грузит данные по протоколу HTTP?
Ecли да — создаем временный HTTP сервер и указываем его URL. А в сервере, передаем нужные данные.
Здравствуйте Аноним, Вы писали:
А>Так. WebBrowser грузит данные по протоколу HTTP? А>Ecли да — создаем временный HTTP сервер и указываем его URL. А в сервере, передаем нужные данные.
Так для этого нужно, чтоб на машине обязательно IP-протокол стоял. И как-то это... из пушки по воробьям, ИМХО.
Здравствуйте Аноним, Вы писали:
L>>А через Mapped файлы никак ?
А>А как указывать URL? Создается ведь только handle файла, а не файл с путем.
А разве хэндл файла нельзя передать в виде строки а в ActiveX сконвертить его назад ? ИМХО
typedef HANDLE DWORD. Или я не прав ?
Здравствуйте staya, Вы писали:
S>Стоит такая задача. Как известно, если использовать метод Navigate интерфейса IWebBrowser2 загрузится соответствующий заданному URL ActiveX-документ. Нужно заставить WebBrowser сделать нечто аналогичное, но не используя URL, а имея данные документа в виде некоего буфера и, скажем, его тип MIME или расширение документа.
L>>>А через Mapped файлы никак ? А>>А как указывать URL? Создается ведь только handle файла, а не файл с путем. L>А разве хэндл файла нельзя передать в виде строки а в ActiveX сконвертить его назад ? ИМХО L>typedef HANDLE DWORD. Или я не прав ?
Куда передать? Беда в том, что ActiveX-документы умеют работать только с полными именами файлов (с путем), а отнюдь не с их хэндлами. Кроме того, ActiveX может быть внешним процессом.
Читайте внимательно! Я ни слова не сказала об HTML! Как загружать HTML из памяти, мне известно. Этот способ не подходит для любого ActiveX-документа, поскольку при этом тип объекта WebBrowser-а Document совершенно другой, соответственно, работает через другие интерфейсы.
Здравствуйте staya, Вы писали:
S>Стоит такая задача. Как известно, если использовать метод Navigate интерфейса IWebBrowser2 загрузится соответствующий заданному URL ActiveX-документ. Нужно заставить WebBrowser сделать нечто аналогичное, но не используя URL, а имея данные документа в виде некоего буфера и, скажем, его тип MIME или расширение документа.
Вы его должны зарегистрировать (см. MSDN keyword MIME или ActiveX)
Далее при загрузке ИЕ даст Вам возможность загрузить свойства через интерфейс IPropertyBag.Загрузите свойство SRC — там будет URL — у меня например при генерации потока CGI-приложением передавалась строка обращения к нему а при загрузке локального файла — путь с префиксом file://.
Если это файл — открывайте, если http то пишете следующий код (я пишу на Дельфи поэтому — Паскаль)
var
stgName: array[0..1024] of WideChar;
buf: string;
os: TOleStream;
fs: TFileStream;
begin
FMoniker := nil;
FBindCtx := nil;
StringToWideChar(Value, stgName, sizeof(stgName));
try
if Pos('file://', Value) <> 0 then
begin
buf := copy(Value, Length('file://') + 1, Length(Value) — Length('file://'));
// Загружаете данные из файла
end
else
if Pos('http://', Value) <> 0 then
if CreateURLMoniker(nil, stgname, FMoniker) = S_OK then
begin
CreateBindCtx(0, FBindCtx);
pm := nil;
FMoniker.BindToStorage(FBindCtx, nil, IID_IStream, pm);
// Загружаете данные из потока pm
end;
except
end;
end;
Да, писать этот код нужно когда вызывается функция IPersistPropertyBag::Load.