EPM(增强保护模式)中的IE BHO工具栏



我正在尝试为IE设计一个工具栏。我已经成功编译了32位64位E9上按预期工作。但是当我在Windows8IE10上尝试时,工具栏没有加载。IE可以在管理插件中看到工具栏,它在那里启用了32位和64位。但它没有加载。我甚至在DllMain方法中放置了一个警告框,但即使这样也不存在。在我的插件中,我添加了IEInternals博客上描述的语句:

DEFINE_GUID(CATID_AppContainerCompatible, 0x59fb2056,0xd625,0x48d0,0xa9,0x44,0x1a,0x85,0xb5,0xab,0x26,0x40);

我还缺少什么?

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工具查看哪些对象已注册到各种类别中。

此外,请确保将BHO的DLL与AppContainer可读文件夹(例如\Program Files\文件夹的子文件夹)一起放置。如果未能执行此操作,则IE实例将不会在增强保护模式下加载DLL。

您需要包含"IEPMapi.h"

IEMapi.h附带Windows SDK Windows 8.1 SDK

然后你需要这样的函数,它会被DllRegisterServer调用,所以当你的dll被regsvr32调用时,它会在注册表HKEY_class_ROOT 下的工具栏类id下标记可编译类别

    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;
   }

最新更新