首页 文章

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

提问于
浏览
1

我正在尝试为 IE 设计一个工具栏 . 我已经成功编译了工具栏的 32-bit64-bit 版本,两者都在 IE9 上按预期工作 . 但是当我在 Windows 8 上的 IE10 上尝试它时,工具栏没有被加载 . IE可以看到管理插件中的工具栏,并在那里启用了32位和64位 . 但它没有加载 . 我've even placed an alert box in DllMain method, but even that'不在那里 . 在我的插件中,我添加了 IEInternals Blog: 中描述的语句

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

我还缺少什么?

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

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

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

  • 0

    你需要包含“IEPMapi.h”

    IEMapi.h附带Windows SDK Windows 8.1 SDK

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

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

相关问题