编写在浏览器中不弹出警告的ActiveX控件

2016-09 睿丰德信息科技有限公司
睿丰德科技 专注RFID识别技术和条码识别技术与管理软件的集成项目。质量追溯系统、MES系统、金蝶与条码系统对接、用友与条码系统对接

我们在编写ActiveX控件时,如果用在浏览器中,经常都会弹出现在运行的脚本不安全的提示, 如果给客户使用,将会带来极大不便。按照MSDN的介绍通常有两种一种是实现IObjectSafe接口,一种是通过修改注册表的方法。一般如果用ATL开发ActiveX控件,就用实现ObjectSafe接口的方法。如果用MFC开发,我觉得还是用修改注册表的方法比较方便。下面我们将第二种方法:

要包括两个文件

1.#include "comcat.h" 2.#include "Objsafe.h"

// 本控件的CLSID,注册表用

1.const GUID CDECL CLSID_SafeItem = 2.{ 0x7AE7497B, 0xCAD8, 0x4E66, { 0xA5,0x8B,0xDD,0xE9,0xBC,0xAF,0x6B,0x61 } };

// 创建组件种类

01.HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription) 02.{ 03.ICatRegister* pcr = NULL ; 04.HRESULT hr = S_OK ; 05.  06.hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, 07.NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); 08.if (FAILED(hr)) 09.return hr; 10.  11.// Make sure the HKCR\Component Categories\{..catid...} 12.// key is registered. 13.CATEGORYINFO catinfo; 14.catinfo.catid = catid; 15.catinfo.lcid = 0x0409 ; // english 16.  17.// Make sure the provided description is not too long. 18.// Only copy the first 127 characters if it is. 19.int len = wcslen(catDescription); 20.if (len>127) 21.len = 127; 22.wcsncpy(catinfo.szDescription, catDescription, len); 23.// Make sure the description is null terminated. 24.catinfo.szDescription[len] = ''\0''; 25.  26.hr = pcr->RegisterCategories(1, &catinfo); 27.pcr->Release(); 28.  29.return hr; 30.}

// 注册组件种类

01.HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid) 02.{ 03.// Register your component categories information. 04.ICatRegister* pcr = NULL ; 05.HRESULT hr = S_OK ; 06.hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, 07.NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); 08.if (SUCCEEDED(hr)) 09.{ 10.// Register this category as being "implemented" by the class. 11.CATID rgcatid[1] ; 12.rgcatid[0] = catid; 13.hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid); 14.} 15.if (pcr != NULL) 16.pcr->Release(); 17.return hr; 18.}

// 卸载组件种类

01.HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid) 02.{ 03.ICatRegister* pcr = NULL ; 04.HRESULT hr = S_OK ; 05.  06.hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, 07.NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr); 08.if (SUCCEEDED(hr)) 09.{ 10.// Unregister this category as being "implemented" by the class. 11.CATID rgcatid[1] ; 12.rgcatid[0] = catid; 13.hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid); 14.} 15.  16.if (pcr != NULL) 17.pcr->Release(); 18.  19.return hr; 20.}

// DllRegisterServer - Adds entries to the system registry

01.STDAPI DllRegisterServer(void) 02.{ 03.HRESULT hr; 04.  05.AFX_MANAGE_STATE(_afxModuleAddrThis); 06.  07.if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid)) 08.return ResultFromScode(SELFREG_E_TYPELIB); 09.  10.if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE)) 11.return ResultFromScode(SELFREG_E_CLASS); 12.  13.// 标记控件初始化安全. 14.// 创建初始化安全组件种类 15.hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!"); 16.if (FAILED(hr)) 17.return hr; 18.// 注册初始化安全 19.hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing); 20.if (FAILED(hr)) 21.return hr; 22.  23.// 标记控件脚本安全 24.// 创建脚本安全组件种类 25.hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!"); 26.if (FAILED(hr)) 27.return hr; 28.// 注册脚本安全组件种类 29.hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting); 30.if (FAILED(hr)) 31.return hr; 32.  33.return NOERROR; 34.}

// DllUnregisterServer - Removes entries from the system registry

view source print? 01.STDAPI DllUnregisterServer(void) 02.{ 03.HRESULT hr; 04.  05.AFX_MANAGE_STATE(_afxModuleAddrThis); 06.  07.if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor)) 08.return ResultFromScode(SELFREG_E_TYPELIB); 09.  10.if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE)) 11.return ResultFromScode(SELFREG_E_CLASS); 12.  13.// 删除控件初始化安全入口. 14.hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing); 15.if (FAILED(hr)) 16.return hr; 17.// 删除控件脚本安全入口 18.hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting); 19.if (FAILED(hr)) 20.return hr; 21.  22.////////////////////////// 23.return NOERROR; 24.}

(全文完)

from:http://www.vckbase.com/index.php/wv/526

RFID管理系统集成商 RFID中间件 条码系统中间层 物联网软件集成

给我们留言

电话咨询
邮件咨询
在线地图
微信15622149977