由于项目需求,需要用到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控件和本页上的其他部分的交互可能不安全。你想允许这种交互吗?的更多相关文章

  1. 在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗

    转自 http://www.cnblogs.com/zdxster/archive/2011/01/27/1945868.html 在EOS6的项目中,如果采用VC++开发的ActiveX,那么第一次 ...

  2. 在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息http://xqy266.blogbus.com/logs/66258230.html 在EOS6的项目中,如果采用VC++开发的Active ...

  3. ATL控件签名之后页面还提示“在此页面上的Activex控件和本页上的其他部分及交互可能不安全”

    ATL控件正常签名打包,然后安装之后还是会提示: 没理由啊,签名是花钱搞得正当的签名.后来查了资料才知道这还不够,需要在创建ATL控件的时候继承一个IObjectSafetyImpl 类 知道了原因, ...

  4. 问题解决:在此页上的ActiveX控件

    打开什么美图秀秀就会弹出windows安全警告?网易闪电邮每打开一封邮件就会出现安全警告?这个对话框无论你点是否,都会再次出现!! 网上的方法教你改ie设置 教你改UAC 通通不好用!!!重装系统也不 ...

  5. C# 在 vs2010 上开发 ActiveX 控件 【千辛万苦啊~】

    由于B/S项目中需要使用到读卡器的功能,但是由于厂家只有提供一个 读卡的dll,那么怎样能在客户端使用读卡器呢,那么进过一番查找,最总决定使用ActiveX 控件来做.由于是第一次接触到 Active ...

  6. Html页中使用OCX控件

    原文:http://blog.csdn.net/mouse8166/article/details/5515657 最近准备开发一个b/s架构的应用程序需要用到activeX控件,web服务器尚未进入 ...

  7. COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)

    声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改而来,因此同样遵循Code Project Open L ...

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

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

  9. 在Web上调用Ocx控件

    原文:http://blog.csdn.net/goodadult2012/article/details/6343369 在HTML页面中使用ActiveX控件包含三个基本操作:将控件放入HTML中 ...

随机推荐

  1. 登录操作(方法一:设置flag标志位)

    登录操作(方法一:设置flag标志位) user_name="star"passwoed='123'passed_authentication=Falsecount=0for i ...

  2. create table常用命令

    CREATE TABLE students( stuID INTEGER NOT NULL , stuname ) not null, sex int NOT NULL ); CREATE TABLE ...

  3. bsgs+求数列通项——bzoj3122(进阶指南模板该进)

    /* 已知递推数列 F[i]=a*F[i-1]+b (%c) 解方程F[x]=t an+1 = b*an + c an+1 + c/(b-1) = b(an + c/(b-1)) an+1 + c/( ...

  4. linux安装PyCharm,PyCharm常用快捷键及调试模式,pycharm里面对文件夹或者文件进行重命名

    PyCharm常用快捷键及调试模式 2017年10月18日 23:13:43 菜鸟之神 阅读数:5835    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...

  5. PAT甲级——A1138 Postorder Traversa【25】

    Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and in ...

  6. 左神算法基础班5_1设计RandomPool结构

    Problem: 设计RandomPool结构 [题目] 设计一种结构,在该结构中有如下三个功能: insert(key):将某个key加入到该结构,做到不重复加入. delete(key):将原本在 ...

  7. 《DSP using MATLAB》Problem 8.35

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  8. springboot-配置多数据源(AOP实现)(HikariCP + MybatisPlus + mysql + SqlServer)

    场景: springboot项目,默认使用HikariCP连接池 + MybatisPlus持久层框架 + mysql数据库等一套流程,现需求需去第三方sqlserver数据库拉取数据,直连数据库,不 ...

  9. 第四周课堂笔记3th

    1.函数的嵌套 作用域,说的是变量 全局作用域:内置命名空间,全局命名空间  全局空间不可以引用局部空间 局部作用域: 局部命名空间  开辟的临时空间前提是调用了函数 全局作用域在整个文件中被使用 L ...

  10. springboot整合mybatis进行跨库查询

    业务场景: 当一个公司大了之后就会将各种业务进行分开,最简单的就是例如:公司的机构表,那么就会将他们分成开来,那么就会在一个实例中, 如果要获取相关信息就会去关联这张表进行关联查询 从而导致了跨库关联 ...