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

本文介绍了如何通过修改注册表来设置MFC开发的ActiveX控件的安全性,使其能在浏览器中安全运行,避免出现脚本不安全的警告。主要步骤包括创建组件类别、注册类别以及注册和注销控件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在编写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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值