2013-07-11 30 views
1

我正在嘗試設計一個工具欄,用於IE。我已經成功編譯了32位64位版本的工具欄,並且兩者都按預期在IE9上工作。但是,當我嘗試IE10Windows 8,工具欄沒有得到加載。 IE能夠在管理插件中看到工具欄,並且在那裏爲32位和64位啓用。但它沒有加載。我甚至在DllMain方法中放置了一個警告框,但即使這樣也不存在。 在我的插件,我已經添加上IEInternals博客中描述的語句:EPM中的IE BHO工具欄(增強保護模式)

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

我思念還有什麼?

回答

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實例加載。

0

您需要包括「IEPMapi.h」

IEMapi.h隨Windows SDK Windows 8.1 SDK

,那麼你需要的功能像這樣得到由所謂的DllRegisterServer所以,當你的DLL被通過REGSVR32它標誌着調用您的工具欄class-id下的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; 
    }