步步学ACTIVEX网页控件开发---创建安全的ActiveX控件

本文介绍如何通过修改代码使ActiveX控件在Internet Explorer中安全加载,避免出现不安全警告。主要步骤包括:1. 在MyActiveX.cpp中添加必要的头文件及安全相关的函数;2. 修改DllRegisterServer函数,注册安全类别;3. 修改DllUnregisterServer函数,注销安全类别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值