步步学ACTIVEX网页控件开发---创建安全的ActiveX控件

2023-10-30 11:08

本文主要是介绍步步学ACTIVEX网页控件开发---创建安全的ActiveX控件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 http://tech.it168.com/a2009/0410/271/000000271815_4.shtml

 

创建安全的ActiveX控件

  要想创建一个能够在IE中成功加载而没有“不安全”的警告或者错误提示信息的ActiveX控件,我们必须实现安全的初始化和脚本。关于安全初始化的更加详细的信息,请参考本文结尾的参考资料“Safe Initialization and Scripting for ActiveX Controls”。基本上,所有要做的工作都是在DllRegisterServer 和DllUnregisterServer这两个函数中完成的。下面,我们就来一步步地将我们的ActiveX控件变成一个“安全的”控件。

  1.编辑MyActiveX.cpp并添加如下的代码。其中,CLSID_SafeItem的值应该跟MyActiveXCtrl.cpp中的IMPLEMENT_OLECREATE_EX一致,这就等同于你的ActiveX控件。同样,它也应该跟你的HTML页面中的OBJECT ID标签中的CLSID一致。

#include  " comcat.h "
#include 
" strsafe.h "
#include 
" objsafe.h "

//  CLSID_SafeItem – 安全的ActiveX控件所必须的内容
//  ID的值跟xxxCtrl.cpp文件中的IMPLEMENT_OLECREATE_EX一致

const  CATID CLSID_SafeItem  =
0x36299202 0x9ef 0x4abf ,{  0xad 0xb9 0x47 0xc5 0x99 0xdb 0xe7 0x78 }};

//  HRESULT CreateComponentCategory – 用于注册安全的ActiveX控件

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;

    
//  确认HKCR/Component Categories/{..catid...}键值被注册

    CATEGORYINFO catinfo;
    catinfo.catid 
=  catid;
    catinfo.lcid 
=   0x0409  ;  //  english

    size_t len;
    
//  确认描述不是太长。
//  只复制开始的127个字符。
//  StringCchLength的第二个参数表示被读入catDescription的最大字符数。
    
//  第三个参数表示字符串的长度

    hr 
=  StringCchLength(catDescription, STRSAFE_MAX_CCH,  & len);
    
if  (SUCCEEDED(hr))
        {
        
if  (len > 127 )
          {
            len 
=   127 ;
          }
        }   
    
else
        {
          
//  TODO: Write an error handler;

        }

    hr 
=  StringCchCopy(catinfo.szDescription, len  +   1 , catDescription);
    
//  添加字符串结束符.
    catinfo.szDescription[len  +   1 =   ' /0 ' ;

    hr 
=  pcr -> RegisterCategories( 1 & catinfo);
    pcr
-> Release();

    
return  hr;
}

//  HRESULT RegisterCLSIDInCategory -

//       注册组件分类信息


HRESULT RegisterCLSIDInCategory(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))
    {
       CATID rgcatid[
1 ] ;
       rgcatid[
0 =  catid;
       hr 
=  pcr -> RegisterClassImplCategories(clsid,  1 , rgcatid);
    }

    
if  (pcr  !=  NULL)
        pcr
-> Release();
            
    
return  hr;
}

//  HRESULT UnRegisterCLSIDInCategory

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))
    {
       CATID rgcatid[
1 ] ;
       rgcatid[
0 =  catid;
       hr 
=  pcr -> UnRegisterClassImplCategories(clsid,  1 , rgcatid);
    }

    
if  (pcr  !=  NULL)
        pcr
-> Release();

    
return  hr;
}

  2.修改 DllRegisterServer函数: 

STDAPI DllRegisterServer( void )
{
    HRESULT hr;    
//  HResult used by Safety Functions 
    AFX_MANAGE_STATE(_afxModuleAddrThis); 
    
if  ( ! AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
      
return  ResultFromScode(SELFREG_E_TYPELIB); 
    
if  ( ! COleObjectFactoryEx::UpdateRegistryAll(TRUE))
      
return  ResultFromScode(SELFREG_E_CLASS); 
    
//  为初始化标记控件为安全控件                                       
    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;
   
//  为脚本标记控件为安全控件                                        
    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;
}

  3.修改 DllUnregisterServer函数: 

STDAPI DllUnregisterServer( void )
{
    HRESULT hr;    
//  HResult used by Safety Functions 
    AFX_MANAGE_STATE(_afxModuleAddrThis); 
    
if  ( ! AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
      
return  ResultFromScode(SELFREG_E_TYPELIB); 
    
if  ( ! COleObjectFactoryEx::UpdateRegistryAll(FALSE))
      
return  ResultFromScode(SELFREG_E_CLASS); 
    hr
= UnRegisterCLSIDInCategory(CLSID_SafeItem,                      CATID_SafeForInitializing);
    
if  (FAILED(hr))
      
return  hr; 
    hr
= UnRegisterCLSIDInCategory(CLSID_SafeItem, 
                        CATID_SafeForScripting);
    
if  (FAILED(hr))
      
return  hr; 
    
return  NOERROR;
}

这篇关于步步学ACTIVEX网页控件开发---创建安全的ActiveX控件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/307489

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并