Встроить приложение в панель Ie
Некоторые приложения, например ICQ, при интсалляции могут встраиваться в панель IE. Как добиться того же эффекта своими руками? Задача стоит так: добавить элемент управления(например image)отвечающий за отображение/не отображение картинок. Может ли тут оказаться полезен VCL или другие стандартные библиотеки BCB?
Можно. И руками и VCL пригодится. Надо писать плагин.
Можно. И руками и VCL пригодится. Надо писать плагин.
А можно посмотреть на пример реализации чего-нибудь похожего? Потому что пока невижу в какую сторону копать.
А можно посмотреть на пример реализации чего-нибудь похожего? Потому что пока невижу в какую сторону копать.
Посмотреть нельзя т.к. ни разу "ничего похожего" не делал, но как сделать примерно знаю и куда копать надо тоже знаю...
Для начала копай здесь:
http://www.rsdn.ru/article/inet/ieplug.xml
http://www.rsdn.ru/article/inet/ieplug2.xml
этого вполне достаточно. Читай будут вопросы дай знать.
Правда возникли трудностис регистрацией COM-сервера. Может кто-нибудь поделится как это делать поэтапно(какие конкретно значения вводить)? Особенно про GUID и разные ID
Все здорово, статьи именно про то, что надо.
Правда возникли трудностис регистрацией COM-сервера. Может кто-нибудь поделится как это делать поэтапно(какие конкретно значения вводить)? Особенно про GUID и разные ID
А Ты пример со статьей скачал? Там все есть.
Не буду парить по теории (к тому же сам не очень там рулю). Скажу как делать проще:
File|New|ActiveX|ActiveXLibrary Ok.
File|New|ActiveX|ComObject ввести имя CoClassName=MyIEExtention, Потоковая модель=Apartment, Описание="Какое хошь..." Ok.
File|Save All ... Ok.
Run|Register ActiveX Server Ok.
Все, можешь не париться COM сервер зарегестрирован. Никаких фабрик класса писать не надо все сделает ATL (практически единственная полезная поделка от MS...).
Далее в MyIEExtentionImpl.h находишь опр. класса и добавляешь соотв. интерфейсы :
class ATL_NO_VTABLE TMyIEExtentionImpl :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<TMyIEExtentionImpl, &CLSID_MyIEExtention>,
public IObjectWithSite, //руками добавляешь к
public IOleCommandTarget,//сгенерированному классу
public IMyIEExtention
...
public:
STDMETHOD(QueryStatus)(const GUID *pCmdGroup, ULONG cCmds, OLECMD *prgCmds,
OLECMDTEXT *pCmdText);
STDMETHOD(Exec)(const GUID *pCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
VARIANTARG *pvaIn, VARIANTARG *pvaOut);
protected:
//IObjectWithSite
public:
STDMETHOD(SetSite)(IUnknown *pUnkSite);
STDMETHOD(GetSite)(REFIID riid, void **ppvSite);
ну и реализацию в MyIEExtentionImpl.cpp не забудь.
Идем дальше...
В файле проекта(где DllEntryPoint) найди DllRegisterServer и DllUnregisterServer и вставь, что-то типа:
{
_Module.RegisterServer(TRUE);
// add some required registration keys
TRegistry* Key = new TRegistry;
if(Key)
{
String guid = "{EE1AFBB6-621B-4D83-A493-6B06B8532148}";//для создания <ваш GUID> - нажми ctrl+shift+G
Key->RootKey = HKEY_LOCAL_MACHINE;
if(Key->OpenKey("SOFTWARE\\Microsoft\\Internet Explorer\\Extensions\\" + guid,true))
{
Key->WriteString("ButtonText","Button Hint");
Key->WriteString("clsid","{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}");
Key->WriteString("Default Visible", "yes");
guid = GUIDToString(CLSID_MyIEExtention);
Key->WriteString("ClsidExtension", guid);
Key->WriteString("HotIcon", "d:\\Projects\\IE\\Plugins\\LinkSave\\icon1.ico");
Key->WriteString("Icon", "d:\\Projects\\IE\\Plugins\\LinkSave\\tbbutton.ico");
Key->WriteString("MenuText", "Ñîõðàíåíèå ññûëîê");
Key->WriteString("MenuStatusBar", "Ñîõðàíåíèå ññûëîê");
Key->CloseKey();
}
delete Key;
} // if(Key)
return S_OK;
}
// Entry point of your Server invoked to instruct the server to remove
// all registry entries created through DllRegisterServer.
//
STDAPI __export DllUnregisterServer(void)
{
TRegistry* Key = new TRegistry;
if(Key)
{
Key->RootKey = HKEY_LOCAL_MACHINE;
String guid = "{EE1AFBB6-621B-4D83-A493-6B06B8532148}";
if(Key->OpenKey("SOFTWARE\\Microsoft\\Internet Explorer\\Extensions\\", false))
{
if(Key->KeyExists(guid))
Key->DeleteKey(guid);
Key->CloseKey();
}
delete Key;
} // if(Key)
return _Module.UnregisterServer();
}
Тогда при регистрации СОМ сервера будут добавляться ключи указанные в статье. Единственно Сам не совсем понял про <ваш GUID>:
[COLOR=green]
Для этого необходимо создать следующий ключ в реестре:
<key root>\Software\Microsoft\Internet Explorer\Extensions \<ваш GUID>[/COLOR]
похоже, что это просто имя раздела, зачем тогда GUID?
Далее в MyIEExtentionImpl.h находишь опр. класса и добавляешь соотв. интерфейсы :
class ATL_NO_VTABLE TMyIEExtentionImpl :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<TMyIEExtentionImpl, &CLSID_MyIEExtention>,
public IObjectWithSite, //руками добавляешь к
public IOleCommandTarget,//сгенерированному классу
public IMyIEExtention
...
public:
...
};
ну и реализацию в MyIEExtentionImpl.cpp не забудь.
Да еще забыл:
BEGIN_COM_MAP(TMyIEExtentionImpl)
COM_INTERFACE_ENTRY(IMyIEExtention)
COM_INTERFACE_ENTRY(IOleCommandTarget)//<<<<<<<<
COM_INTERFACE_ENTRY(IObjectWithSite) //<<<<<<<<
END_COM_MAP()
Khasya куда пропал? Есть результат?
Я не пропал, тут я:) Достигнутые результаты:
пример из статьи почти заработал, осталось разобраться с .ini файлом(написать и прописать).
Уже сейчас на панели IE красуется моя иконка(sic!), а меню Сервис обрело новое лицо, дополненное пунктом Links :). Доведу работу примера до состояния "рабочий" и примусь за реализация Моей задачи. Т.е. добавить иконку управления отображать/не отображать картинки.
GIZMO - я иногда буду исчезать и появляться вновь в теме, уже началась учеба как-никак :)
А ваще - нереальный thanks за все.
Копаем дальше :)