【问题标题】:IE BHO Toolbar in EPM (Enhanced Protected Mode)EPM 中的 IE BHO 工具栏(增强保护模式)
【发布时间】:2026-01-23 10:20:04
【问题描述】:

我正在尝试为 IE 设计一个工具栏。我已经成功编译了工具栏的 32 位64 位 版本,并且两者都在 IE9 上按预期工作。但是当我在 Windows 8 上的 IE10 上尝试时,工具栏没有加载。 IE 能够在管理插件中看到工具栏,并且在 32 位和 64 位中启用了它。但它没有加载。我什至在 DllMain 方法中放置了一个警告框,但即使这样也不存在。 在我的插件中,我添加了 IEInternals 博客中描述的语句:

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

我还缺少什么?

【问题讨论】:

    标签: internet-explorer bho epm


    【解决方案1】:

    DEFINE_GUID 调用只是在您的代码中定义 GUID 值常量,它实际上并没有将您的对象注册到 COM 组件类别(存储在注册表中)。

    请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms692551(v=vs.85).aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms694322(v=vs.85).aspx

    您可以使用 OLEView 工具查看哪些对象已注册到各种类别中。

    此外,请务必将 BHO 的 DLL 放在 AppContainer 可读文件夹中(例如,\Program Files\ 文件夹的子文件夹)。如果不这样做,您的 DLL 将不会被增强保护模式下的 IE 实例加载。

    【讨论】:

      【解决方案2】:

      您需要包含“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;
         }
      

      【讨论】: