Activex控制元件的IObjectSafety介面問題

Max Woods發表於2014-10-10
我的05年做流氓外掛的時候,就注意到了這個問題,只要登錄檔加入 類似的就可以  HKEY_CLASSES_ROOT\Component    Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
   HKEY_CLASSES_ROOT\Component    Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
   HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented    Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
   HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented    Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}   
7DD95801-9882-11CF-9FA9-00AA006C42C4為安全空間的ID。 如果是ATL的工程,很簡單需要在控制元件中實現IObjectSafety介面, class CLoginCtl :     .... ,     public IObjectSafetyImpl<CLoginCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA> { ... BEGIN_COM_MAP(CLoginCtl) COM_INTERFACE_ENTRY(IObjectSafety) END_COM_MAP() ... } 或者 BEGIN_CATEGORY_MAP(CLoginCtl) IMPLEMENTED_CATEGORY(CATID_SafeForInitializing) msdn http://support.microsoft.com/kb/168371/en-us
07年給啟明星辰做天清漢馬SSLVPN客戶端的時候,當時老孟強烈建議使用mfc的ocx,所以就沒做atl的,當時使用還是vc6,雖然已經有了vc8。 時隔5年之後,我又開始寫SSLVPN客戶端,發現vc6寫的ocx在IE8上經常崩潰,而且還要處理DEP的問題,只能使用atl8之後的版本。 在初始化控制元件之前,IE會呼叫IObjectSafety::SetInterfaceSafetyOptions強制ocx處理不信任的資料初始化和呼叫。 public IObjectSafetyImpl<CXXXAgent, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA >, 詭異的是vc8,vc9可以執行public IObjectSafetyImpl<CXXXAgent, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_DISPEX | INTERFACE_USES_SECURITY_MANAGER>, vc10只能執行public IObjectSafetyImpl<CXXXAgent, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA >。

相關文章