IE为什么要标记这些ActiveX控件安全性
如果不标记为安全的话,在访问含有这个控件的页面时会弹出“该页上的ActiveX控件与页上的其它部分进行交互可能不安全,是否允许进行交互?”这个会给最终一种恐吓的作用。要想不弹出这个,就得把你的ActiveX控件标记为脚本安全和初始化安全。
如果你是用ATL做的控件的话实现IObjectSafeImpl接口比较方便,如果是用MFC的话在注册组件的时候注册两个键值比较方便。
以下详细介绍后者
在注册表中
HKEY_CLASSES_ROOT\Component Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}是用于标记脚本安全的 HKEY_CLASSES_ROOT\Component Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}是用于标记初始化安全的 只要在你的控件的注册项里面加上这两个东西的继承就行了,比如说我的: HKEY_CLASSES_ROOT\CLSID\{4EF107C9-3A2D-4C29-81E4-6AF551AB4B4C}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{4EF107C9-3A2D-4C29-81E4-6AF551AB4B4C}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
其中4EF107C9-3A2D-4C29-81E4-6AF551AB4B4C是我的控件的GUID
在程序上面实现的话主要是下面的一个函数和注册组件函数的修改。
///注册Implemented Categories项 HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid) { // Register your component categories information. ICatRegister* pcr = NULL ; HRESULT hr = S_OK ; hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); if (SUCCEEDED(hr)) { // Register this category as being "implemented" by the class. CATID rgcatid[1] ; rgcatid[0] = catid; hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid); } if (pcr != NULL) pcr->Release(); return hr; } STDAPI DllRegisterServer(void) { HRESULT hr; AFX_MANAGE_STATE(_afxModuleAddrThis); if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid)) return ResultFromScode(SELFREG_E_TYPELIB); if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE)) return ResultFromScode(SELFREG_E_CLASS); // Mark the control as safe for initializing. hr = RegisterCLSIDInCategory(Safe_Item, CATID_SafeForInitializing); if (FAILED(hr)) return hr; // Mark the control as safe for scripting. /* hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!"); if (FAILED(hr)) return hr; */ hr = RegisterCLSIDInCategory(Safe_Item, CATID_SafeForScripting); if (FAILED(hr)) return hr; return NOERROR; }
以上两个函数都是参照MSDN写的,但是MSDN里面有一些东西说的不对。
第一,不需要自己注册脚本安全性和初始化安全性的Category
第二,反注册的时候不需要自己把删除注册的安全性的东西,因为本来自动生成的那些代码会把这个类的注册及其所有的子项,你如果按MSDN的示例写的话会在反注册的时候报错的。
以上代码要包含
转载请注明:Yovae Studio » 让ActiveX控件不弹出安全提示