Панель инструментов IE BHO в EPM (расширенный защищенный режим)
Я пытаюсь создать панель инструментов для IE. Я успешно скомпилировал 32-битную и 64-битную версии панели инструментов, и обе они работают, как и ожидалось, в IE9. Но когда я пробую это на IE10 на Windows 8, панель инструментов не загружается. IE может видеть панель инструментов в Управлении надстройками, и она включена там для 32 и 64 бит. Но это не загрузка. Я даже поместил окно предупреждения в метод DllMain, но даже этого там нет. В свой плагин я добавил утверждение, описанное в блоге IEInternals:
DEFINE_GUID(CATID_AppContainerCompatible, 0x59fb2056,0xd625,0x48d0,0xa9,0x44,0x1a,0x85,0xb5,0xab,0x26,0x40);
Что еще мне не хватает?
2 ответа
Вызов DEFINE_GUID просто определяет константу значения GUID в вашем коде, на самом деле он ничего не делает для регистрации вашего объекта в категории компонентов COM (которая хранится в реестре).
См. http://msdn.microsoft.com/en-us/library/windows/desktop/ms692551(v=vs.85).aspx и http://msdn.microsoft.com/en-us/library/windows/desktop/ms694322(v=vs.85).aspx
Вы можете увидеть, какие объекты зарегистрированы в различных категориях, используя инструмент OLEView.
Кроме того, не забудьте поместить DLL-файл вашего BHO в читаемую AppContainer папку (например, подпапку папки \Program Files\). Если вы этого не сделаете, ваша DLL не будет загружена экземпляром IE в расширенном защищенном режиме.
Вы должны включить "IEPMapi.h"
IEMapi.h поставляется с Windows SDK Windows 8.1 SDK
тогда вам нужна такая функция, которая вызывается DllRegisterServer, поэтому, когда ваша dll вызывается regsvr32, она помечает категорию comptabile под идентификатором класса вашей панели инструментов в реестре HKEY_CLASS_ROOT.
bool RegisterCLSIDInCategory(REFCLSID clsID)
{
CComPtr<ICatRegister> catRegister = NULL ;
HRESULT hr = ::CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICatRegister,
(void**)&catRegister);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by
// the class.
CATID rgcatid[] ={ CATID_AppContainerCompatible};
HRESULT hr2 = catRegister->RegisterClassImplCategories(clsID, 1, rgcatid);
if (SUCCEEDED(hr2))
{
return true;
}
}
return false;
}