• 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;
    }

  • 相关阅读:
    jQuery offset获取坐标不精确的问题
    RPG Maker VX地图随机气泡对话 Ver1.0
    Qt绘图控件qwt绘制等比例坐标图
    Java服务端极光推送整合Ios、Android
    Jpush给 iOS 平台推送 title 值失败
    java之Hibenate中监听事件的重写和二级cache缓存
    java之Hibeante中SQL语句的使用
    Hibernate注解符合主键关联关系、持久化传播、继承映射
    hibernate之数据库注解关联关系
    hibernate(四) 双向多对多映射关系
  • 原文地址:https://www.cnblogs.com/indif/p/2111756.html
Copyright © 2020-2023  润新知