zoukankan      html  css  js  c++  java
  • 编写在浏览器中不弹出警告的ActiveX控件

    我们在编写ActiveX控件时,如果用在浏览器中,经常都会弹出现在运行的脚本不安全的提示, 如果给客户使用,将会带来极大不便。按照MSDN的介绍通常有两种一种是实现IObjectSafe接口,一种是通过修改注册表的方法。一般如果用ATL开发ActiveX控件,就用实现ObjectSafe接口的方法。如果用MFC开发,我觉得还是用修改注册表的方法比较方便。下面我们将第二种方法:

    要包括两个文件

    1.#include "comcat.h"
    2.#include "Objsafe.h"

    // 本控件的CLSID,注册表用

    1.const GUID CDECL CLSID_SafeItem =
    2.{ 0x7AE7497B, 0xCAD8, 0x4E66, { 0xA5,0x8B,0xDD,0xE9,0xBC,0xAF,0x6B,0x61 } };

    // 创建组件种类

    01.HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
    02.{
    03.ICatRegister* pcr = NULL ;
    04.HRESULT hr = S_OK ;
    05. 
    06.hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
    07.NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
    08.if (FAILED(hr))
    09.return hr;
    10. 
    11.// Make sure the HKCRComponent Categories{..catid...}
    12.// key is registered.
    13.CATEGORYINFO catinfo;
    14.catinfo.catid = catid;
    15.catinfo.lcid = 0x0409 ; // english
    16. 
    17.// Make sure the provided description is not too long.
    18.// Only copy the first 127 characters if it is.
    19.int len = wcslen(catDescription);
    20.if (len>127)
    21.len = 127;
    22.wcsncpy(catinfo.szDescription, catDescription, len);
    23.// Make sure the description is null terminated.
    24.catinfo.szDescription[len] = '''';
    25. 
    26.hr = pcr->RegisterCategories(1, &catinfo);
    27.pcr->Release();
    28. 
    29.return hr;
    30.}

    // 注册组件种类

    01.HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
    02.{
    03.// Register your component categories information.
    04.ICatRegister* pcr = NULL ;
    05.HRESULT hr = S_OK ;
    06.hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
    07.NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
    08.if (SUCCEEDED(hr))
    09.{
    10.// Register this category as being "implemented" by the class.
    11.CATID rgcatid[1] ;
    12.rgcatid[0] = catid;
    13.hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
    14.}
    15.if (pcr != NULL)
    16.pcr->Release();
    17.return hr;
    18.}

    // 卸载组件种类

    01.HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
    02.{
    03.ICatRegister* pcr = NULL ;
    04.HRESULT hr = S_OK ;
    05. 
    06.hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
    07.NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
    08.if (SUCCEEDED(hr))
    09.{
    10.// Unregister this category as being "implemented" by the class.
    11.CATID rgcatid[1] ;
    12.rgcatid[0] = catid;
    13.hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);
    14.}
    15. 
    16.if (pcr != NULL)
    17.pcr->Release();
    18. 
    19.return hr;
    20.}

    // DllRegisterServer - Adds entries to the system registry

    01.STDAPI DllRegisterServer(void)
    02.{
    03.HRESULT hr;
    04. 
    05.AFX_MANAGE_STATE(_afxModuleAddrThis);
    06. 
    07.if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
    08.return ResultFromScode(SELFREG_E_TYPELIB);
    09. 
    10.if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
    11.return ResultFromScode(SELFREG_E_CLASS);
    12. 
    13.// 标记控件初始化安全.
    14.// 创建初始化安全组件种类
    15.hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!");
    16.if (FAILED(hr))
    17.return hr;
    18.// 注册初始化安全
    19.hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
    20.if (FAILED(hr))
    21.return hr;
    22. 
    23.// 标记控件脚本安全
    24.// 创建脚本安全组件种类
    25.hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!");
    26.if (FAILED(hr))
    27.return hr;
    28.// 注册脚本安全组件种类
    29.hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
    30.if (FAILED(hr))
    31.return hr;
    32. 
    33.return NOERROR;
    34.}

    // DllUnregisterServer - Removes entries from the system registry

    01.STDAPI DllUnregisterServer(void)
    02.{
    03.HRESULT hr;
    04. 
    05.AFX_MANAGE_STATE(_afxModuleAddrThis);
    06. 
    07.if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
    08.return ResultFromScode(SELFREG_E_TYPELIB);
    09. 
    10.if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
    11.return ResultFromScode(SELFREG_E_CLASS);
    12. 
    13.// 删除控件初始化安全入口.
    14.hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
    15.if (FAILED(hr))
    16.return hr;
    17.// 删除控件脚本安全入口
    18.hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
    19.if (FAILED(hr))
    20.return hr;
    21. 
    22.//////////////////////////
    23.return NOERROR;
    24.}

    (全文完)

    from:http://www.vckbase.com/index.php/wv/526

  • 相关阅读:
    ResourceManager总体架构
    Yarn聚合日志
    Hive参数配置方法
    Hive任务日志及日志调试
    bugku web web3
    bugku web 矛盾
    bugku web web基础
    Bugku 杂项 眼见非实
    Bugku 杂项 啊哒
    JarvisOJ Basic Help!!
  • 原文地址:https://www.cnblogs.com/lidabo/p/3605318.html
Copyright © 2011-2022 走看看