zoukankan      html  css  js  c++  java
  • VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

     三、MFC Activex 安全问题:

    1、在默认环境下,编译的MFC Activex控件,只能在本地代码中运行,即在http://localhost/xxx/xxx.htm中执行,而在http://127.0.0.1/xxx/xxx.htm中提示无相关属性,需要设置其初始化和脚本运行的安全性

    ActiveX在远程IE页面上执行,需要实现安全接口。

    在ATL写的ActiveX中,用IObjectSafety。

    http://support.microsoft.com/kb/168371/en-us

    在MFC写的ActiveX中,直接修改注册表。

    http://support.microsoft.com/kb/161873/en-us

    mfc实现的ocx,要在app实现文件中包括两个文件:

     在ActivexDemo.cpp 文件中实现以下方法

     #include  " stdafx.h " 

    #include  " ActivexDemo.h " 
    #include  < comcat.h >     
    #include  < objsafe.h > 
    #ifdef _DEBUG
    #define  new DEBUG_NEW 
    #endif 

    CActivexDemoApp theApp;

    const  GUID CDECL BASED_CODE _tlid  = 
            {  0x344B8576 ,  0xAB2C ,  0x4D38 , {  0xAE ,  0x7 ,  0x73 ,  0x74 ,  0x22 ,  0x89 ,  0x72 ,  0xEA  } };
    const  WORD _wVerMajor  =   1 ;
    const  WORD _wVerMinor  =   0 ;



    //  CActivexDemoApp::InitInstance - DLL 初始化 

    BOOL CActivexDemoApp::InitInstance()
    {
        BOOL bInit  =  COleControlModule::InitInstance();

         if  (bInit)
        {
             //  TODO: 在此添加您自己的模块初始化代码。 
        }

         return  bInit;
    }



    //  CActivexDemoApp::ExitInstance - DLL 终止 

    int  CActivexDemoApp::ExitInstance()
    {
         //  TODO: 在此添加您自己的模块终止代码。 

         return  COleControlModule::ExitInstance();
    }

    //  创建组件种类     
    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;    
         //  Make sure the HKCRComponent Categories{..catid...}    
         //  key is registered.     
        CATEGORYINFO catinfo;    
        catinfo.catid  =  catid;    
        catinfo.lcid  =   0x0409  ;  //  english    
         //  Make sure the provided description is not too long.    
         //  Only copy the first 127 characters if it is.     
         int  len  =  wcslen(catDescription);    
         if  (len > 127 ) len  =   127 ;    
        wcsncpy(catinfo.szDescription, catDescription, len);    
         //  Make sure the description is null terminated.     
        catinfo.szDescription[len]  =   '  ' ;    
        hr  =  pcr -> RegisterCategories( 1 ,  & catinfo);    
        pcr -> Release();    
         return  hr;    
    }  

    //  注册组件种类     
    HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
     {    
         //  Register your component categories information.     
        ICatRegister *  pcr  =  NULL ;    
        HRESULT hr  =  S_OK ;    
        hr  = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void ** ) & pcr);    
         if  (SUCCEEDED(hr)) {    
           //  Register this category as being "implemented" by the class.     
          CATID rgcatid[ 1 ];    
          rgcatid[ 0 ]  =  catid;    
          hr  =  pcr -> RegisterClassImplCategories(clsid,  1 , rgcatid);    
        }    
         if  (pcr  !=  NULL) pcr -> Release();    
         return  hr;    
    }    
    //  卸载组件种类     
    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)) {    
           //  Unregister this category as being "implemented" by the class.     
          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);    
         //  标记控件初始化安全.    
         //  创建初始化安全组件种类     
        hr  =  CreateComponentCategory(CATID_SafeForInitializing, L "Controls safely initializable from persistent data! " );    
         if  (FAILED(hr))  return  hr;    
         //  注册初始化安全     
        hr  =  RegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForInitializing);    
         if  (FAILED(hr))  return  hr;    
         //  标记控件脚本安全    
         //  创建脚本安全组件种类     
        hr  =  CreateComponentCategory(CATID_SafeForScripting, L " Controls safely scriptable! " );    
         if  (FAILED(hr))  return  hr;    
         //  注册脚本安全组件种类     
        hr  =  RegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForScripting);    
         if  (FAILED(hr))  return  hr;    
         return  NOERROR;    
    }    
    //  DllUnregisterServer - Removes entries from the system registry     
    STDAPI DllUnregisterServer( void ) 
    {    
        HRESULT hr;    
        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(BASED_CODE _tlid , CATID_SafeForInitializing);    
         if  (FAILED(hr))  return  hr;    
         //  删除控件脚本安全入口     
        hr = UnRegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForScripting);    
         if  (FAILED(hr))  return  hr;    
         return  NOERROR;    
    }  

    现在控件就可以在自注册时就注册为安全控件了。

    2、设置项目属性 将配置类型设置成静态库(.lib)

    3、       最后生成项目,ocx控件就产生了。 

  • 相关阅读:
    设计一个圆柱体类,计算表面积及体积。建立一个半径为3、高为3.5的圆柱体,输出其表面积及体积
    写一个方法完成如下功能,判断从文本框textbox1输入的一个字符,如果是数字则求该数字的阶乘,如果是小写字条,则转换为大写,大写字符不变,结果在文本框textbox2中显示
    写一方法用来计算1+2+3+...n,其中n作为参数输入,返回值可以由方法名返回,也可以由参数返回
    winform控件记录
    写4个同名方法,实现两个整数、两个实数,一个实数一个整数,一个整数一个实数之间的求和。在主调函数中调用这4个方法计算相关的值。(方法的重载)
    写一方法计算实现任意个整数之和.在主调函数中调用该函数,实现任意个数之和。(使用params参数)
    在主函数中提示用户输入用户名和密码。另写一方法来判断用户输入是否正确。该方法分别返回一个bool类型的登录结果和和一个string类型的登录信息。如登录成功,返回true及“登录成功”,若登录失败则返回false及“用户名错误”或“密码错误”(使用out参数)
    Linux下使用Kickstart自动化安装平台架构
    Day10 多线程理论 开启线程
    关闭ipv6的方法
  • 原文地址:https://www.cnblogs.com/dengpeng1004/p/4692231.html
Copyright © 2011-2022 走看看