步步学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

相关文章

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部