1

我正在尝试为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);

我还缺少什么?

4

2 回答 2

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/桌面/ms694322(v=vs.85).aspx

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

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

于 2013-07-12T03:16:04.670 回答
0

您需要包含“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;
   }
于 2013-12-12T04:38:06.330 回答