去掉IE提示:在此页上的ActiveX控件和本页上的其他部分的交互可能不安全。你想允许这种交互吗?
由于项目需求,需要用到OCX控件。而在IE浏览器中加载OCX控件会有如下提示:
这是因为OCX控件有一个ID,而这个ID注册后IE不认为该OCX控件是安全的。所以,必须把这个控件注册为安全控件。
假设已经创建好OCX控件工程了。操作步骤如下:
第一步:在xxxApp类头文件(.h)添加如下函数声明。
// 去掉IE提示“此控件不安全的”提示框;
// Helper function to create a component category and associated
// description
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);
// Helper function to register a CLSID as belonging to a component
// category
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
// Helper function to unregister a CLSID as belonging to a component
// category
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
注意:这些函数声明不是xxxApp类成员函数声明,而是全局函数声明。
第二步:在xxxApp类的实现文件(.cpp)添加如下函数实现。
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
{
ICatRegister* pcr = NULL;
HRESULT hr = S_OK;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICatRegister,
(void**)&pcr);
if (FAILED(hr))
return hr;
// Make sure the HKCR/Component Categories/{..catid...}
// key is registered
CATEGORYINFO catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409; // english
// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is
int len = wcslen(catDescription);
if (len > )
len = ;
wcsncpy(catinfo.szDescription, catDescription, len);
// Make sure the description is null terminated
catinfo.szDescription[len] = '/0';
hr = pcr->RegisterCategories(, &catinfo);
pcr->Release();
return hr;
} HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
// Register your component categories information.
ICatRegister* pcr = NULL;
HRESULT hr = S_OK;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICatRegister,
(void**)&pcr);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by
// the class.
CATID rgcatid[];
rgcatid[] = catid;
hr = pcr->RegisterClassImplCategories(clsid, , rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
} HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
ICatRegister *pcr = NULL;
HRESULT hr = S_OK;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Unregister this category as being "implemented" by the class.
CATID rgcatid[];
rgcatid[] = catid;
hr = pcr->UnRegisterClassImplCategories(clsid, , rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
第三步:在xxxApp类的实现文件(xxx.cpp)定义两个GUID用来注册控件的安全性,同时需要定义要注册为安全的CLSID。
const CATID CATID_SafeForScripting = { 0x7dd95801, 0x9882, 0x11cf, { 0x9f, 0xa9, 0x00, 0xaa, 0x00, 0x6c, 0x42, 0xc4 } };
const CATID CATID_SafeForInitializing = { 0x7dd95802, 0x9882, 0x11cf, { 0x9f, 0xa9, 0x00, 0xaa, 0x00, 0x6c, 0x42, 0xc4 } }; const CATID CLSID_SafeItem = { 0xedb3ce, 0xe6b9, 0x4883, { 0x83, 0xc0, 0x3f, 0xbb, 0x40, 0xf7, 0x58, 0x5f } };
两个GUID为CATID_SafeForScripting 、CATID_SafeForInitializing;安全的CLSID为CLSID_SafeItem。
在OCX控件注册完成后,在注册表的如下地方可以看到上面的两个GUID。
1)32位版本位置:
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\[xxxCtrl类的uuid]\Implemented Categories,下面有这两个GUID。
2)64位版本位置:
HKEY_CLASSES_ROOT\CLSID\[xxxCtrl类的uuid]\Implemented Categories,下面有这两个GUID。
注意:[xxxCtrl类的uuid]是xxx.idl文件中xxxCtrl的类信息的uuid。
CLSID_SafeItem的值是根据在xxxCtrl类实现文件(xxxCtrl.cpp)中IMPLEMENT_OLECREATE_EX的定义而来的(实际上就是ActiveX的CLASSID)。IMPLEMENT_OLECREATE_EX值如下:
第四步:修改OCX控件的注册、反注册代码。
// DllRegisterServer - 将项添加到系统注册表
STDAPI DllRegisterServer(void)
{
//AFX_MANAGE_STATE(_afxModuleAddrThis);
//if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
// return ResultFromScode(SELFREG_E_TYPELIB);
//if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
// return ResultFromScode(SELFREG_E_CLASS);
//return NOERROR; //新注册代码
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
if (FAILED(CreateComponentCategory(
CATID_SafeForScripting,
L"Controls that are safely scriptable")))
return ResultFromScode(SELFREG_E_CLASS);
if (FAILED(CreateComponentCategory(
CATID_SafeForInitializing,
L"Controls safely initializable from persistent data")))
return ResultFromScode(SELFREG_E_CLASS);
if (FAILED(RegisterCLSIDInCategory(
CLSID_SafeItem, CATID_SafeForScripting)))
return ResultFromScode(SELFREG_E_CLASS);
if (FAILED(RegisterCLSIDInCategory(
CLSID_SafeItem, CATID_SafeForInitializing)))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
} // DllUnregisterServer - 将项从系统注册表中移除
STDAPI DllUnregisterServer(void)
{
//AFX_MANAGE_STATE(_afxModuleAddrThis);
//if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
// return ResultFromScode(SELFREG_E_TYPELIB);
//if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
// return ResultFromScode(SELFREG_E_CLASS);
//return NOERROR; //新反注册代码
HRESULT hr;
AFX_MANAGE_STATE(_afxModuleAddrThis);
// Remove entries from the registry.
hr = UnRegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
hr = UnRegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForScripting);
if (FAILED(hr))
return hr;
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
至此完成了注册安全性的OCX控件。
去掉IE提示:在此页上的ActiveX控件和本页上的其他部分的交互可能不安全。你想允许这种交互吗?的更多相关文章
- 在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗
转自 http://www.cnblogs.com/zdxster/archive/2011/01/27/1945868.html 在EOS6的项目中,如果采用VC++开发的ActiveX,那么第一次 ...
- 在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全
版权声明:转载时请以超链接形式标明文章原始出处和作者信息http://xqy266.blogbus.com/logs/66258230.html 在EOS6的项目中,如果采用VC++开发的Active ...
- ATL控件签名之后页面还提示“在此页面上的Activex控件和本页上的其他部分及交互可能不安全”
ATL控件正常签名打包,然后安装之后还是会提示: 没理由啊,签名是花钱搞得正当的签名.后来查了资料才知道这还不够,需要在创建ATL控件的时候继承一个IObjectSafetyImpl 类 知道了原因, ...
- 问题解决:在此页上的ActiveX控件
打开什么美图秀秀就会弹出windows安全警告?网易闪电邮每打开一封邮件就会出现安全警告?这个对话框无论你点是否,都会再次出现!! 网上的方法教你改ie设置 教你改UAC 通通不好用!!!重装系统也不 ...
- C# 在 vs2010 上开发 ActiveX 控件 【千辛万苦啊~】
由于B/S项目中需要使用到读卡器的功能,但是由于厂家只有提供一个 读卡的dll,那么怎样能在客户端使用读卡器呢,那么进过一番查找,最总决定使用ActiveX 控件来做.由于是第一次接触到 Active ...
- Html页中使用OCX控件
原文:http://blog.csdn.net/mouse8166/article/details/5515657 最近准备开发一个b/s架构的应用程序需要用到activeX控件,web服务器尚未进入 ...
- COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改而来,因此同样遵循Code Project Open L ...
- 使你的ActiveX控件执行时不弹出安全性提示(转载)
我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘.注意 ...
- 在Web上调用Ocx控件
原文:http://blog.csdn.net/goodadult2012/article/details/6343369 在HTML页面中使用ActiveX控件包含三个基本操作:将控件放入HTML中 ...
随机推荐
- zabbix配置文件解析
zabbix的配置文件一般有三种:zabbixserver的配置文件zabbix_server.confzabbixproxy的配置文件zabbix_proxy.confzabbix_agentd的配 ...
- MySql学习笔记(一)之DQL常用查询
MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前, ...
- Failed to read artifact descriptor for org.springframework.cloud:spring-cloud-starter-config:jar:unk
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframew ...
- 集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack
大数据之心 关注 0.6 2017.02.22 15:36* 字数 2158 阅读 16457评论 7喜欢 9 简介 X-Pack 已经作为 Elastic 公司单独的产品线,前身是 Shield, ...
- Windows与Linux获取进程集合的方法
Windows: List<String> tasklist=new ArrayList<String>(); try { Process process = Runtime. ...
- 06_mybatis关系映射
1.数据库表分析 表与表之间的业务关系: 在分析表与表之间的业务关系时需要建立 在某个业务意义基础上去分析; 先分析数据级别之间有关系的表之间的业务关系; usre和orders: use ...
- Django的日常-AJAX
目录 Django的日常-AJAX AJAX简介 AJAX与JQ的一个实例 AJAX与contentType AJAX传json格式 AJAX传文件 Django的日常-AJAX AJAX简介 首先A ...
- 02-python 学习第二天
今天学习了以下几个方面的内容,虽然部分内容不能理解,跟着老师写出了代码. 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 程序练习1:购物车程序 请闭眼写出以下程序. 程序: ...
- 异常处理记录: Servlet class X is not a javax.servlet.Servlet
使用Maven的tomcat插件启动Web项目, 访问资源时, 发生如下异常: https://stackoverflow.com/questions/1036702/my-class-is-not- ...
- index方法用于数据集的强制索引操作
index方法为3.2.3版本新增,用于数据集的强制索引操作,例如: $Model->index('user')->select(); 对查询强制使用user索引,user必须是数据表实际 ...