• MFC ActiveX开发


    http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html

    http://ticktick.blog.51cto.com/823160/610784

    ActiveX开发的一个完整的示例,还包括了怎样实现控件安全(使IE不弹出安全提示),以及控件打CAB包和数字签名:http://www.codeproject.com/KB/COM/CompleteActiveX.aspx

    对于控件安全的实现代码,摘抄如下,原理就是修改控件注册函数(DllRegisterServer),使控件在注册表中注册为安全控件

    首先引用三个头文件

    #include "comcat.h"
    #include "strsafe.h"
    #include "objsafe.h"

    然后定义要注册为安全的控件对象ID,这个GUID取控件的GUID,可以从xxxCtrl.cpp中的IMPLEMENT_OLECREATE_EX调用参数中找到。
    const CATID CLSID_SafeItem =
    {0x36299202, 0x9ef, 0x4abf,{ 0xad, 0xb9, 0x47, 0xc5, 0x99, 0xdb, 0xe7, 0x78}};

    然后定义三个函数
    // Used to register ActiveX control as safe
    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;

            CATEGORYINFO catinfo;
            catinfo.catid = catid;
            catinfo.lcid = 0x0409;
            size_t len;
            hr = StringCchLength(catDescription, STRSAFE_MAX_CCH, &len);
            if (FAILED(hr))
                    return hr;
            if (len>127)        len = 127;

            hr = StringCchCopy(catinfo.szDescription, len + 1, catDescription);
            catinfo.szDescription[len + 1] = '\0';

            hr = pcr->RegisterCategories(1, &catinfo);
            pcr->Release();

            return hr;
    }

    // Register your component categories information
    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;
    }

    // Remove entries from the registry
    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;
    }

    最后修改控件注册和反注册函数实现,在注册表中把控件注册为安全的。

    STDAPI DllRegisterServer(void)
    {
            HRESULT hr;

            AFX_MANAGE_STATE(_afxModuleAddrThis);

            if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
                    return ResultFromScode(SELFREG_E_TYPELIB);

            if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
                    return ResultFromScode(SELFREG_E_CLASS);

            // Mark the control as safe for initializing.
            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;

            // Mark the control as safe for scripting.
            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;
    }
    STDAPI DllUnregisterServer(void)
    {
            HRESULT hr;

            AFX_MANAGE_STATE(_afxModuleAddrThis);

            // Remove entries from the registry.
            hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
            if (FAILED(hr))
                    return hr;

            hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
            if (FAILED(hr))
                    return hr;

            if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
                    return ResultFromScode(SELFREG_E_TYPELIB);

            if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
                    return ResultFromScode(SELFREG_E_CLASS);

            return NOERROR;
    }

  • 相关阅读:
    小米2系列板砖自救行动
    大公司都有哪些开源项目~~~阿里,百度,腾讯,360,新浪,网易,小米等
    SQLServer 2016安装时的错误:Polybase要求安装Oracle JRE 7更新51或更高版本
    异步方法不能使用ref和out的解决方法
    大公司都有哪些开源项目~~~简化版
    08.LoT.UI 前后台通用框架分解系列之——多样的Tag选择器
    07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
    BIOS中未启用虚拟化支持系列~~例如:因此无法安装Hyper-V
    【开源】1句代码搞定图片批量上传,无需什么代码功底【无语言界限】
    06.LoT.UI 前后台通用框架分解系列之——浮夸的图片上传
  • 原文地址:https://www.cnblogs.com/indif/p/2111756.html
Copyright © 2020-2023  润新知