На выходных реализовал субж. Сущность подключаемых протоколов заключается в том, что можно добавлять в Internet Explorer новые протоколы в придачу к http:, ftp:, res: и пр.
В частности, для примера я сделал "протокол" netres:, аналог res: для managed ресурсов. К примеру, можно по адресу netres:System.Drawing/System.Drawing.DefaultComponent.bmp увидеть замечательную маленькую шестерёнку.
Пока, правда, не реализован интерфейс IInternetProtocolInfo, да и глючки встречаются.
Если кто хочет подключиться к затее — давайте. Тут бы и статью написать, да соавтора нет. В одиночку как-то туго статью продвинуть.
Вообще, я думаю, после обкатки эта технология должна прижиться в Янусе. Там как раз простого метода загрузки HTML'я в браузер не хватает. Для раскрутки можно сначала сделать отдельный модуль, чтоб просматривать сообщения из базы Януса без запущенного самого Януса. Прикольнее всего было бы, чтобы "янус-протокол" ожидал строку в том же виде, как и в Интернете:
Во-первых, у меня дома поломался Windows, поэтому всё компилируется из командной строки, без Visual Studio. Компилируется при помощи compile.bat.
В корневом каталоге лежат исходники библиотечки с PluginProtocolBase. В этой же библиотеке есть NamespaceHandler (реализует IInternetProtocolInfo), но ещё слишком сырой.
В подкаталоге urlmon лежит интероп-библиотечка Urlmon.Interop.dll с объявленными интерфейсами типа IInternetProtocol и неоходимыми структурами. Многие из типов откомментированы в соответвтвующем Urlmon.Interop.xml. Это удобно для использования в Visual Studio. Документаторский xml-файл создан при помощи самописного скрпита путём импорта из MSDN. Так что комментарии аутентичные.
В подкаталоге resource-browse лежит реализация протокола netres. Для установки нужно зарегистрировать resxh.exe при помощи regasm. При запуске resxh.exe должен бы регистрироваться в реестре как Pluggable Protocol, но почему-то этого не делает. Поэтому нужно его ручками прописывать в ключе HKCR\PROTOCOLS\Handlers, как это описывается в MSDN.
Кроме того, в том же подкаталоге нужно удалить resxh.dll. Он там случайно остался, я перезакачивать весь архив мне не хочется. Удалите, потому что могут быть глюки с assembly bind.
И ещё. Пример протокола netres: глючит на больших ресурсах. Скорее всего, ошибка где-то в реализации метода IInternetProtocol.Read. Но на маленьких всё работает. Кроме показа ресурсов, можно заходит на url типа netres:System.Drawing и видеть отформатированный в HTML список ресурсов этой сборки.
L>IInternetSession.RegisterNameSpace не пробовал использовать? А то у меня какие-то непонятки с ним.
Пробовал, что заметно в классе NamespaceHandler (как раз закомментировал этот кусок). Не работает, видимо по причине IClassFactory. Не хочет дотнет такой интерфейс допускать.
Я даже пытался вызвать из mscoree GetDllClassObject, но всё без толку. Пока отложил эту проблему как менее важную.
Здравствуйте, mihailik, Вы писали:
M>Пробовал, что заметно в классе NamespaceHandler (как раз закомментировал этот кусок). Не работает, видимо по причине IClassFactory. Не хочет дотнет такой интерфейс допускать.
M>Я даже пытался вызвать из mscoree GetDllClassObject, но всё без толку. Пока отложил эту проблему как менее важную.
Кому как. По мне так логичнее и правильнее в своих приложениях использовать NameSpace-ы, а не гадить в реестр почем зря.
Здравствуйте, mihailik, Вы писали:
M>Добрый день!
M>На выходных реализовал субж. Сущность подключаемых протоколов заключается в том, что можно добавлять в Internet Explorer новые протоколы в придачу к http:, ftp:, res: и пр.
Делал я такое, могу исходники поискать, если надо, т.с. для компании. А так вообще, отказался от этой затеи, в пользу ASP.NET. Ведь на локальной машине можно и под Cassini это дело запустить, имхо более стройно получается, фича с просмотром в самой VS.NET вместо стандартной страницы решается.
Да, вопрос с удаленно установленным RSDN@Home тоже.
M>>Я даже пытался вызвать из mscoree GetDllClassObject, но всё без толку. Пока отложил эту проблему как менее важную.
L>Кому как. По мне так логичнее и правильнее в своих приложениях использовать NameSpace-ы, а не гадить в реестр почем зря.
Гадить в реестр — нормальное действие при инсталяции. Ага? Особенно, если речь идёт о COM Interop.
Если нежелательно допускать запуск своего хандлера из внешних эксплореров, тогда стоит сделать временный namespace. А для таких вещей, как MSDN Help или Янус, логичнее глобальный постоянный.
Короче, вот вчера вечером разобрался. IClassFactory добывается через mscoree DllGetClassObject. Отсюда следует, что namespace handler должен быть зарегистрирован как COM-объект.
public static void RegisterTemporaryHandler( Type HandlerType, string Namespace )
{
// Это дополнительные проверки,
// реализованы ли нужные интерфейсы.
checkHandlerType(HandlerType);
Guid handlerGuid=HandlerType.GUID;
Guid iid_IClassFactory=NativeMethods.IID_IClassFactory;
// IClassFactory для нашего типа HandlerType
// получаем через вызов mscoree DllGetClassObject
// — так, как это делается в COM Interop.object handlerCF;
int hResult=NativeMethods.DllGetClassObject(
ref handlerGuid,
ref iid_IClassFactory,
out handlerCF );
Marshal.ThrowExceptionForHR( hResult );
if( hResult!=0 )
throw new Exception("Unknown error in mscoree.DllGetClassObject().");
string emptyStr=null;
IInternetSession session;
NativeMethods.CoInternetGetSession(
IntPtr.Zero,
out session,
IntPtr.Zero );
session.RegisterNameSpace(
handlerCF,
ref handlerGuid,
Namespace,
0,
ref emptyStr,
0 );
}
internal sealed class NativeMethods
{
internal static readonly Guid IID_IClassFactory = new Guid("00000001-0000-0000-C000-000000000046");
[DllImport("urlmon.dll")]
internal static extern voidCoInternetGetSession(
IntPtr dwSessionMode,
out IInternetSession ppIInternetSession,
IntPtr dwReserved );
[DllImport("mscoree.dll")]
internal static extern intDllGetClassObject(
ref Guid rclsid,
ref Guid riid,
[MarshalAs(UnmanagedType.IUnknown)]
out object ppv );
}
M>>На выходных реализовал субж. Сущность подключаемых протоколов заключается в том, что можно добавлять в Internet Explorer новые протоколы в придачу к http:, ftp:, res: и пр.
SL>Делал я такое, могу исходники поискать, если надо, т.с. для компании.
Что такое "т.с. для компании"?
По поводу исходников, то я бы не отказался посмотреть. Хорошо бы на C#, а не на C++. Свой бы код подправил, потому что глючит.
SL>А так вообще, отказался от этой затеи, в пользу ASP.NET. Ведь на локальной машине можно и под Cassini это дело запустить, имхо более стройно получается, фича с просмотром в самой VS.NET вместо стандартной страницы решается.
Ну, это, конечно, по задаче. Возьми хотя бы тот же chm.
Другое потенциальное применение этих протоколов — создание HTML-интерфейса. Если HTML можно будет грузить из managed ресурсов, то можно сделать редактируемый в Design-Time HTML-интерфейс.
Здравствуйте, mihailik, Вы писали:
M>>>На выходных реализовал субж. Сущность подключаемых протоколов заключается в том, что можно добавлять в Internet Explorer новые протоколы в придачу к http:, ftp:, res: и пр.
SL>>Делал я такое, могу исходники поискать, если надо, т.с. для компании.
M>Что такое "т.с. для компании"?
так сказать для компании
M>По поводу исходников, то я бы не отказался посмотреть. Хорошо бы на C#, а не на C++. Свой бы код подправил, потому что глючит.
Ну ладно, надо на c#, будет на c#, лови мейлером.
SL>>А так вообще, отказался от этой затеи, в пользу ASP.NET. Ведь на локальной машине можно и под Cassini это дело запустить, имхо более стройно получается, фича с просмотром в самой VS.NET вместо стандартной страницы решается.
M>Ну, это, конечно, по задаче. Возьми хотя бы тот же chm.
+1
M>Другое потенциальное применение этих протоколов — создание HTML-интерфейса. Если HTML можно будет грузить из managed ресурсов, то можно сделать редактируемый в Design-Time HTML-интерфейс.
Я там в письме написал, что сам задумывал, может чем пригодится.
Hello, "mihailik"
> На выходных реализовал субж. Сущность подключаемых протоколов заключается в том, что можно добавлять в Internet Explorer новые протоколы в придачу к http:, ftp:, res: и пр. > > В частности, для примера я сделал "протокол" netres:, аналог res: для managed ресурсов. К примеру, можно по адресу netres:System.Drawing/System.Drawing.DefaultComponent.bmp увидеть замечательную маленькую шестерёнку. > > Пока, правда, не реализован интерфейс IInternetProtocolInfo, да и глючки встречаются. > > Если кто хочет подключиться к затее — давайте. Тут бы и статью написать, да соавтора нет. В одиночку как-то туго статью продвинуть. >
Наверное стоит написать подобное предложение в форуме по COM — там любят старые технологии
Posted via RSDN NNTP Server 1.6
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.