Панель инструментов 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;
   }
Другие вопросы по тегам