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

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

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

目录
相关文章
|
6月前
|
Web App开发 移动开发 JavaScript
【前端用法】HTML5 Video标签如何屏蔽右键视频另存为的js代码以及如何禁用浏览器控件,Video 禁止鼠标右键下载
【前端用法】HTML5 Video标签如何屏蔽右键视频另存为的js代码以及如何禁用浏览器控件,Video 禁止鼠标右键下载
174 0
|
3月前
|
安全
关于浏览器警告提示 - This Set-Cookie header didn‘t specify a SameSite attribute
关于浏览器警告提示 - This Set-Cookie header didn‘t specify a SameSite attribute
135 0
|
缓存 前端开发
[Css 修改后 Google浏览器上无效果] 文件上有:Generated source files should not be edited 的警告
[Css 修改后 Google浏览器上无效果] 文件上有:Generated source files should not be edited 的警告
166 0
[Css 修改后 Google浏览器上无效果] 文件上有:Generated source files should not be edited 的警告
MFC中使用浏览器控件
MFC中使用浏览器控件
85 0
|
Web App开发 安全 数据库
Mozilla计划向Firefox浏览器中添加违规警告
Mozilla 计划向 Firefox 浏览器中添加警告通知,当用户访问过得网站被黑客入侵时。黑客入侵网络服务和网站是互联网上常见的事情,虽然黑客可能有不同的目的,但他们都想盗取网站的用户数据库。
1422 0
|
Web App开发 JavaScript 前端开发
NPAPI——实现非IE浏览器的类似ActiveX的本地程序(插件)调用
  一.Netscape Plugin Interface(NPAPI) 大致的说明可以看下官方文档Plugin 本文主要针对于JavaScript与插件交互部分做一些交流,比如用于数字证书的操作(淘宝和支付宝的插件),用于播放的flash player插件等 与javascri...
1982 0
|
JavaScript
JQuery - 点击浏览器后退键时发出警告 (demo)
jQuery(document).ready(function ($) { if (window.
875 0

热门文章

最新文章