最新消息:网站改版咯

让ActiveX控件不弹出安全提示

C语言 Yovae 1281浏览

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控件不弹出安全提示