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

相关文章

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时