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

编写在浏览器中不弹出警告的ActiveX控件的更多相关文章

  1. 20160513--js 弹出窗口带有iframe控件 备忘

    需要引用JQuery. /*! * 主 题:<页面弹出窗口> * 说 明:用于页面弹出的窗口. * 功能描述: * 1.生成弹出窗口,窗口内包括iframe控件: * 2.窗口弹出时,生成 ...

  2. winfrom弹出窗口用timer控件控制倒计时20秒后关闭

    功能描述: 因为在程序退出时需要确认是否是误操作,所以加了密码输入的子窗体,子窗体在20秒内会自动关闭 代码如下: private int count; private void Form2_Load ...

  3. 使你的ActiveX控件执行时不弹出安全性提示(转载)

    我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘.注意 ...

  4. ocx控件避免弹出警告的类--2

    本文与 OCX控件避免弹出安全警告的类 http://www.cnblogs.com/lidabo/archive/2013/03/26/2981852.html 有些类似,只不过增加了几行代码(红色 ...

  5. Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)

    一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...

  6. ActiveX控件打包成Cab实现浏览器自动下载安装

    前言 我们在浏览器中使用我们自己的一些OCX,或者是DLL这一类的文件,在X86的机器上需要我们手动将这些文件拷贝到Windows/System32 文件夹下面去,然后通过Dos命令regsvr32 ...

  7. 手机浏览器浏览WebApp弹出的键盘遮盖住文本框的解决办法

    手机浏览器浏览WebApp弹出的键盘遮盖住文本框的解决办法 最近碰到Android微信内置浏览H5页面,因为其中的文本输入框(input)放置在靠近页面的中下方,点击文本框以后,则输入框会被弹出的手机 ...

  8. 【2017-05-02】winform弹出警告框是否进行增删改操作、记事本制作、对话框控件和输出输入流

    一.winform弹出警告框是否进行增删改操作 第一个参数是弹出窗体显示的内容,第二个参数是标题,第三个参数是该弹窗包含确定和取消按钮. 返回的是一个枚举类接收一下. 再进行判断,如果点的是确定按钮, ...

  9. 【2017-05-02】winform弹出警告框选择性操作、记事本制作、对话框控件和输入输出流

    一.winform弹出警告框选择性操作 MessageBox.Show()返回一个枚举类值(第一个参数为弹出窗口显示的内容,第二个参数为弹出窗口的标题,第三个参数为弹出窗口包含的按钮) 先新建一个变量 ...

随机推荐

  1. C中的链接属性及作用域

    如果相同的标识符出现在几个不同的源文件中时,它们是表示相同的实体,还是不同的实体.标识符的链接属性决定如何处理在不同文件中出现的标识符.标识符的作用域与它的链接属性有关. 链接属性一般有三种:exte ...

  2. net use \\192.168.54.145 /user:administrator "12345qwert"无法连接,错误码1326

    1.在远程机的"控制面板-文件夹选项-查看-简单的文件共享",去掉选取,然后再尝试连接 2.控制面板\所有控制面板项\管理工具 下-->本地安全策略-->安全设置--& ...

  3. javascript每日一练(十一)——多物体运动

    一.多物体运动 需要注意:每个运动物体的定时器作为物体的属性独立出来互不影响,属性与运动对象绑定,不能公用: 例子1: <!doctype html> <html> <h ...

  4. QLineEdit 仿QQ签名框

    今天鼓捣了半天,终于实现了自定义Qt中的QlineEdit控件的大致效果. 这个问题对于新手而言,主要有以下几个难点: 1.继承QLineEdit控件 2.QSS设置QLineEdit的相关样式,可以 ...

  5. 在开发 ExtJS 应用程序常犯的 10 个错误

    这是 CNX 公司在开发 ExtJS 项目中总结的需要特别注意的 10 个地方.有时候,我们完全是自己使用 ExtJS 从零开始构建的新的应用程序,但有时候我们的客户会要求我们使用他们自己的代码,并且 ...

  6. bzoj 1901: Zju2112 Dynamic Rankings(树套树)

    1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...

  7. c语言:链表排序, 链表反转

    下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...

  8. iTunes Store:隐藏和取消隐藏已购项目

    使用 Mac 或 PC 上的 iTunes 来隐藏或取消隐藏已购项目. 如何隐藏已购项目 在 Mac 或 PC 上打开 iTunes. 从 Store 菜单中,选取商店 > 登录,然后输入您的 ...

  9. Azure 云 Web 应用程序

    Azure 云 Web 应用程序 原文:Getting Started作者:Rick Anderson翻译:谢炀(Kiler)校对:孟帅洋(书缘).刘怡(AlexLEWIS).何镇汐 设置开发环境 安 ...

  10. js获取网页屏幕可见区域高度

    document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.docume ...