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

相关文章

VSCode开发中有哪些好用的插件和快捷键

《VSCode开发中有哪些好用的插件和快捷键》作为全球最受欢迎的编程工具,VSCode的快捷键体系是提升开发效率的核心密码,:本文主要介绍VSCode开发中有哪些好用的插件和快捷键的相关资料,文中... 目录前言1、vscode插件1.1 Live-server1.2 Auto Rename Tag1.3

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

input的accept属性让文件上传安全高效

《input的accept属性让文件上传安全高效》文章介绍了HTML的input文件上传`accept`属性在文件上传校验中的重要性和优势,通过使用`accept`属性,可以减少前端JavaScrip... 目录前言那个悄悄毁掉你上传体验的“常见写法”改变一切的 html 小特性:accept真正的魔法:让

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js