MSDN原文。ActiveX控件标记安全(可以不仅仅是MFC ActiveX)

概要

默认情况下,MFC ActiveX 控件未标记为对脚本编写是安全的和对初始化是安全的。控制运行在 Internet Explorer 中使用的安全级别设置为中或高时,这一点很明显。在上述这些模式中,控件的数据是不安全或不可能安全脚本中使用该控件,可能会显示警告。

有两个控件可用于消除这些错误的方法。第一个涉及实现 IObjectSafety 接口的控件,并对于想要更改其行为变得"安全"的互联网浏览器的上下文中运行的控件很有用。第二步是修改控件的 DllRegisterServer 函数,若要在注册表中标记该控件的"安全"。本文介绍了这些方法中的第二个。第一种方法,实现 IObjectSafety 接口,Internet 客户端 SDK 中介绍。

请记住一个控件应仅标记为安全,如果它是,事实上,安全。请参阅有关此说明 Internet 客户端 SDK 文档。在组件开发部分,请参阅"安全初始化和脚本的 ActiveX 控件"。

注意:本文不介绍如何将控件标记为安全的下载。有关代码下载和代码签名的详细信息,请参阅 Internet 客户端 SDK。

更多信息

请按照这些步骤将 MFC ActiveX 控件标记为脚本安全而对初始化是安全的:
  1. 通过将下面的 cathelp.h 和 cathelp.cpp 文件添加到项目实施的 CreateComponentCategory 和 RegisterCLSIDInCategory 的帮助器函数。

    Cathelp.h

          #include "comcat.h"
    
          // Helper function to create a component category and associated
    // description
    HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription); // Helper function to register a CLSID as belonging to a component
    // category
    HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);

    Cathelp.cpp

          #include "comcat.h"
    
          // Helper function to create a component category and associated
    // description
    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; // Make sure the HKCR\Component Categories\{..catid...}
    // key is registered
    CATEGORYINFO catinfo;
    catinfo.catid = catid;
    catinfo.lcid = 0x0409 ; // english // Make sure the provided description is not too long.
    // Only copy the first 127 characters if it is
    int len = wcslen(catDescription);
    if (len>127)
    len = 127;
    wcsncpy(catinfo.szDescription, catDescription, len);
    // Make sure the description is null terminated
    catinfo.szDescription[len] = '\0'; hr = pcr->RegisterCategories(1, &catinfo);
    pcr->Release(); return hr;
    } // Helper function to register a CLSID as belonging to a component
    // category
    HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
    {
    // Register your component categories information.
    ICatRegister* pcr = NULL ;
    HRESULT hr = S_OK ;
    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_ICatRegister,
    (void**)&pcr);
    if (SUCCEEDED(hr))
    {
    // Register this category as being "implemented" by
    // the class.
    CATID rgcatid[1] ;
    rgcatid[0] = catid;
    hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
    } if (pcr != NULL)
    pcr->Release(); return hr;
    }
  2. 修改标记为安全的控件 DllRegisterServer。
          #include "CatHelp.h"
    						

    定义与安全组件类别关联的 GUID:

          const CATID CATID_SafeForScripting     =
    {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
    const CATID CATID_SafeForInitializing =
    {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};

    定义与您的控件关联的 GUID。为简单起见,您可以贷款的 GUID IMPLEMENT_OLECREATE_EX 在控件的主.cpp 文件中的宏。稍微调整格式,这样,它看上去如下所示:

          const GUID CDECL BASED_CODE _ctlid =
    { 0x43bd9e45, 0x328f, 0x11d0,
    { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };

    若要为这两个安全可将您的控件标记为脚本和初始化,修改的 DllRegisterServer 函数,如下所示:

          STDAPI DllRegisterServer(void)
    {
    AFX_MANAGE_STATE(_afxModuleAddrThis); if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
    return ResultFromScode(SELFREG_E_TYPELIB); if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
    return ResultFromScode(SELFREG_E_CLASS); if (FAILED( CreateComponentCategory(
    CATID_SafeForScripting,
    L"Controls that are safely scriptable") ))
    return ResultFromScode(SELFREG_E_CLASS); if (FAILED( CreateComponentCategory(
    CATID_SafeForInitializing,
    L"Controls safely initializable from persistent data") ))
    return ResultFromScode(SELFREG_E_CLASS); if (FAILED( RegisterCLSIDInCategory(
    _ctlid, CATID_SafeForScripting) ))
    return ResultFromScode(SELFREG_E_CLASS); if (FAILED( RegisterCLSIDInCategory(
    _ctlid, CATID_SafeForInitializing) ))
    return ResultFromScode(SELFREG_E_CLASS); return NOERROR;
    }

这些原因有两个不正常情况下应修改的 DllUnregisterServer 函数:

  • 您不想要删除的组件类别,因为其他控件可能正在使用它。
  • 虽然没有定义一个 UnRegisterCLSIDInCategory 函数,默认情况下 DllUnregisterServer 控制的项,从注册表删除完全。因此,从控件的注册删除类别是几乎没有什么用处。

在编译并注册您的控件,会在注册表中找到以下项:

   HKEY_CLASSES_ROOT\Component
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\Component
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}

参考

Internet 客户端 SDK 组件开发的安全初始化和脚本运行 ActiveX 控件的

如何将 MFC ActiveX 控件标记为安全,脚本和初始化的更多相关文章

  1. 发布MFC ActiveX控件并实现自动更新

    一.        引言 上一篇我们讲了如何使用 VC 2005来开发 MFC ActiveX控件,我们开发 ActiveX控件最终目的是将 ActiveX控件发布出来并嵌入在 Web网页中,随着控件 ...

  2. 开发ActiveX控件调用另一个ActiveX系列1——开发一个MFC ActiveX控件

    ActiveX开发的教程有很多,我也从中受益匪浅,例如以下这几篇: 基本教程:http://www.cnblogs.com/guenli/articles/1629915.html 注意事项:http ...

  3. VC ++ MFC activex 控件获取连接的VPN 信息

    vc++  MFC 进行activex  控件的开发步骤就不用多写了,只是简单的说明一下方法,以及具体的代码: 使用的类库是 windows 系统的 rasapi32.dll 记住需要添加的头文件如下 ...

  4. 将ActiveX控件标记为安全

    參考网页 http://msdn.microsoft.com/en-us/library/aa751977(v=vs.85).aspx http://support.microsoft.com/kb/ ...

  5. 用ATL和MFC来创建ActiveX控件

    摘要:目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发.MFC代表了创建独立的Windows应用的一种简单.一致的方法:ATL提供了一种框架来实现创建COM客户机和服务器所 ...

  6. 【转载】基于MFC的ActiveX控件开发(1)

    原文:http://iysm.net/?p=114 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC下ActiveX控件的开发可以分为三种,一 ...

  7. MFC-[转]基于MFC的ActiveX控件开发

    作者:lidan | 出处:博客园 | 2012/3/13 16:10:34 | 阅读22次 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC ...

  8. ActiveX控件开发

    VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程 开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是 ...

  9. 使用回调接口实现ActiveX控件和它的容器程序的通讯

    本文阅读基础:有一定的C++基础知识(了解继承.回调函数),对MFC的消息机制有一定了解,对COM的基础知识有一定了解,对ActiveX控件有一定了解. 一. 前言 ActiveX控件和它的容器程序如 ...

随机推荐

  1. MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)

    MyBitis(iBitis)系列随笔之一:MyBitis入门实例 MyBitis(iBitis)系列随笔之二:类型别名(typeAliases)与表-对象映射(ORM) MyBitis(iBitis ...

  2. Android采用HttpClient下载图片

    在上一章中谈到Android采用HttpURLConnection下载图片,本章使用HttpClient下载图片 HttpURLConnection与HttpClient的差别: HttpClient ...

  3. NAND FLASH

    NAND Flash 以Micron公司的MT29F2G08为例介绍NAND Flash原理和使用. 1. 概述 MT29F2G08使用一个高度复用的8-bit总线(I/O[7:0])来数据传输.地址 ...

  4. ExtJs中的Grid具体操作(笔记及心得)

    一.基本操作步骤 var cm=new Ext.grid.ColumnModel([ //对列的定义,cm是它的简写,作为真个表格的列模式,需要首先创建的{header:'编号',dataIndex: ...

  5. jsf小例子

    有人问我用过jsf没?   当时没有用过,就看了一下: 写了一个小例子  JSF和struts2 差不多的,都有一些配置和跳转 struts2的action配置和JSF的faces-config.xm ...

  6. BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

    树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...

  7. Linux学习之守护进程详解

    Linux系统守护进程详解                                                              ---转自:http://yuanbin.blog ...

  8. printf不同格式表示法

    格式代码 A ABC ABCDEFGH %S A ABC ABCDEFGH %5S ####A ##ABC ABCDEFGH %.5S A ABC ABCDE %5.5S ####A ##ABC AB ...

  9. scanf一次给多个变量赋值

    本节课程笔记: 一是对多个变量进行赋值,二是对非法输入的值做正确处理(处理方式了解即可,相关函数知识后期讲解),三是美化scanf代码加入输出说明. /* Name:scanf一次给多个变量赋值 Co ...

  10. director.js教程

    directive.js 初始化和注册路由 director.js 的主要对象是Router对象,构造方法如下: var router = new Router(routes); //routes为路 ...