zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    一步一步教你认识闭包
    爬虫入门系列(三):用 requests 构建知乎 API
    爬虫入门系列(二):优雅的HTTP库requests
    爬虫入门系列(一):快速理解HTTP协议
    Python中参数是传值,还是传引用?
    切图及效果图管理
    在GlassFish应用服务器上创建并运行你的第一个Restful Web Service【翻译】
    hybrid开发设计
    Gson解析数组多类型元素
    eclipse项目迁移到android studio(图文最新版)
  • 原文地址:https://www.cnblogs.com/indif/p/2111756.html
Copyright © 2011-2022 走看看