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

相关文章

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 开发的打飞机游戏脚本代码解释初始化部

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创