编写在浏览器中不弹出警告的ActiveX控件
我们在编写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控件的更多相关文章
- 20160513--js 弹出窗口带有iframe控件 备忘
需要引用JQuery. /*! * 主 题:<页面弹出窗口> * 说 明:用于页面弹出的窗口. * 功能描述: * 1.生成弹出窗口,窗口内包括iframe控件: * 2.窗口弹出时,生成 ...
- winfrom弹出窗口用timer控件控制倒计时20秒后关闭
功能描述: 因为在程序退出时需要确认是否是误操作,所以加了密码输入的子窗体,子窗体在20秒内会自动关闭 代码如下: private int count; private void Form2_Load ...
- 使你的ActiveX控件执行时不弹出安全性提示(转载)
我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘.注意 ...
- ocx控件避免弹出警告的类--2
本文与 OCX控件避免弹出安全警告的类 http://www.cnblogs.com/lidabo/archive/2013/03/26/2981852.html 有些类似,只不过增加了几行代码(红色 ...
- Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)
一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...
- ActiveX控件打包成Cab实现浏览器自动下载安装
前言 我们在浏览器中使用我们自己的一些OCX,或者是DLL这一类的文件,在X86的机器上需要我们手动将这些文件拷贝到Windows/System32 文件夹下面去,然后通过Dos命令regsvr32 ...
- 手机浏览器浏览WebApp弹出的键盘遮盖住文本框的解决办法
手机浏览器浏览WebApp弹出的键盘遮盖住文本框的解决办法 最近碰到Android微信内置浏览H5页面,因为其中的文本输入框(input)放置在靠近页面的中下方,点击文本框以后,则输入框会被弹出的手机 ...
- 【2017-05-02】winform弹出警告框是否进行增删改操作、记事本制作、对话框控件和输出输入流
一.winform弹出警告框是否进行增删改操作 第一个参数是弹出窗体显示的内容,第二个参数是标题,第三个参数是该弹窗包含确定和取消按钮. 返回的是一个枚举类接收一下. 再进行判断,如果点的是确定按钮, ...
- 【2017-05-02】winform弹出警告框选择性操作、记事本制作、对话框控件和输入输出流
一.winform弹出警告框选择性操作 MessageBox.Show()返回一个枚举类值(第一个参数为弹出窗口显示的内容,第二个参数为弹出窗口的标题,第三个参数为弹出窗口包含的按钮) 先新建一个变量 ...
随机推荐
- block 解析 - 静态变量
静态变量 上一篇 我们了解了block全局变量的使用,静态变量和全局变量一样,可以直接在block内部使用,也可以在block内部修改 引用官方文档: Global variables are acc ...
- ListView优化问题
可以参考:http://blog.csdn.net/bill_ming/article/details/8817172和http://blog.csdn.net/xiangjai/article/de ...
- 转:Android -- ActivityLifeCycleCallbacks
http://www.cnblogs.com/yydcdut/p/4945990.html 一个不常见类的使用,名字叫ActivityLifeCycleCallbacks 通常一个项目中有很多个act ...
- LifecyclePhaseNotFoundException(转)
This error is generated if you try to invoke a build command that Maven does not understand. In gene ...
- vi 快捷键积累
依据自己用到的.或者还没记住的.或者用的时候忘了的,慢慢积累. 一.全选复制粘贴. 全选: ggVG // 凝视: gg 光标移到首行 V 进入Visual(可视)模式 G 光标移到最后一行全选 选中 ...
- urllib模块
python爬虫-urllib模块 urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web ...
- WCF技术剖析之十七:消息(Message)详解(中篇)
原文:WCF技术剖析之十七:消息(Message)详解(中篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]在上篇中 ...
- Java获取随机数的几种方法
Java获取随机数的几种方法 .使用org.apache.commons.lang.RandomStringUtils.randomAlphanumeric()取数字字母随机10位; //取得一个3位 ...
- 基于visual Studio2013解决面试题之0909移动星号
题目
- 跟我一起写 Makefile(一)
跟我一起写 Makefile 陈皓 概述—— 什么是makefile?也许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我认为要作一个好的和pro ...