activex com 组件开发二 安全接口的实现
来源:互联网 发布:极客范树莓派网络配置 编辑:程序博客网 时间:2024/04/29 00:00
上篇文章介绍了 一个 控件的创建,但是控件嵌入ie 是不安全的行为 ,ie浏览器老弹出安全提示,这一节实现他的安全接口, 让ie 不弹出提示。
对于MFC写的ActiveX,通过修改注册表的方式来实现控件的安全性,微软说明http://support2.microsoft.com/kb/161873/en-us。下面做个简单的翻译:
1、在项目中创建两个文件 Cathelp.h
#include "comcat.h"// Helper function to create a component category and associated// descriptionHRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);// Helper function to register a CLSID as belonging to a component// categoryHRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);// HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
2 、Cathelp.cpp
#include "stdafx.h"#include "comcat.h"#include "strsafe.h"#include "objsafe.h"// HRESULT CreateComponentCategory - Used to register ActiveX control as safe 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 size_t len; // Make sure the provided description is not too long. // Only copy the first 127 characters if it is. // The second parameter of StringCchLength is the maximum // number of characters that may be read into catDescription. // There must be room for a NULL-terminator. The third parameter // contains the number of characters excluding the NULL-terminator. hr = StringCchLength(catDescription, STRSAFE_MAX_CCH, &len); if (SUCCEEDED(hr)) { if (len>127) { len = 127; } } else { // TODO: Write an error handler; } // The second parameter of StringCchCopy is 128 because you need // room for a NULL-terminator. hr = StringCchCopy(catinfo.szDescription, len + 1, catDescription); // Make sure the description is null terminated. catinfo.szDescription[len + 1] = '\0'; hr = pcr->RegisterCategories(1, &catinfo); pcr->Release(); return hr;} // HRESULT RegisterCLSIDInCategory -// Register your component categories information 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[1] ; rgcatid[0] = catid; hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid); } if (pcr != NULL) pcr->Release(); return hr;} // HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry 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[1] ; rgcatid[0] = catid; hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid); } if (pcr != NULL) pcr->Release(); return hr;}
3、在ActivexTest.cpp文件中,添加CLSID_SafeItem的定义
上面括号中的值 ActivexTestCrtl.cpp中获取到 如图
4、ActivexTest.cpp添加两个头文件:
#include "Cathelp.h"#include "objsafe.h"
5、ActivexTest.cpp中DllRegisterServer和DllUnregisterServer函数.
// DllRegisterServer - 将项添加到系统注册表// DllRegisterServer - Adds entries to the system registrySTDAPI DllRegisterServer(void){HRESULT hr; // HResult used by Safety FunctionsAFX_MANAGE_STATE(_afxModuleAddrThis);if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))return ResultFromScode(SELFREG_E_TYPELIB);if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))return ResultFromScode(SELFREG_E_CLASS);// Mark the control as safe for initializing.hr = CreateComponentCategory(CATID_SafeForInitializing,L"Controls safely initializable from persistent data!");if (FAILED(hr))return hr;hr = RegisterCLSIDInCategory(CLSID_SafeItem,CATID_SafeForInitializing);if (FAILED(hr))return hr;// Mark the control as safe for scripting.hr = CreateComponentCategory(CATID_SafeForScripting,L"Controls safely scriptable!");if (FAILED(hr))return hr;hr = RegisterCLSIDInCategory(CLSID_SafeItem,CATID_SafeForScripting);if (FAILED(hr))return hr;return NOERROR;}// DllUnregisterServer - Removes entries from the system registrySTDAPI DllUnregisterServer(void){AFX_MANAGE_STATE(_afxModuleAddrThis);// 删除控件初始化安全入口. HRESULT 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;}
7、到这 安全接口就完成实现,ie就不会弹出提示。
0 0
- activex com 组件开发二 安全接口的实现
- activeX com 组件开发 一
- VC ActiveX实现安全接口
- ATL开发的activex要放上网能调用方法要先实现安全接口
- COM组件接口继承的实现
- COM组件接口继承的实现
- COM组件接口继承的实现
- ActiveX需要实现哪些COM接口
- ATL 支持ActiveX控件开发的所实现的接口
- 【软件测试自动化-QTP系列讲座 8】==自定义COM组件的实现 (二)activex dll生成篇==
- MASM32开发COM组件【二】
- 使用COM组件的IPicture接口---实现图片显示
- Delphi COM接口編程(ActiveX Library)(二)
- COM 组件接口的 IUnKnown 接口介绍
- ActiveX控件安全初始化之一:实现ISafeObject接口
- ActiveX控件安全初始化之一:实现ISafeObject接口
- ActiveX控件安全初始化之一:实现ISafeObject接口(转)
- ActiveX控件安全初始化之一:实现ISafeObject接口
- 汇编语言---开机启动流程
- WinForm子窗体和母窗体的交互
- 时针分针重合问题与时针、分针、秒针重合问题
- 基于UDP、TCP协议的C#网络编程
- 学习:java设计模式—工厂模式
- activex com 组件开发二 安全接口的实现
- 一道笔试题 关于static
- JavaScript快速排序算法QuickSort实现
- Access to the path '' is denied.解决方案
- 服务器推送
- Hadoop2.5.1伪分布式安装记录,Centos6.4系统,wordcount运行测试
- 2014.9.27模拟赛【栅栏迷宫】
- 消除SDK更新时的“https://dl-ssl.google.com refused”错误
- javascript 将 ThinkPHP 分页自动转换为 bootstrap 分页