`
ispring
  • 浏览: 359450 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

web上用Activex控件开发步骤(MFC)

阅读更多

首先要说明的是 web上用activex是门被抛弃的技术。为什么这么说,主要基于以下几个原因:1.功能过于强大,强大到一旦安装,他所具有的权限可以做任何事,极易被人利用做坏事(相信大家都有浏览网页后莫名被安装流氓软件的经历,当然流氓软件利用的方式不止控件一种);2。通过网页下载控件的中间过程受到操作系统、杀毒软件、浏览器等多方面因素限制,这使你的控件产品未必能在所有用户的电脑上正常使用;3。最恶心的一点,未签名没有正规安全证书的控件,在最新的浏览器上(IE7等)默认安全策略是直接屏蔽掉的,而你如果想要获取这个信任,需要向微软等少数单位申请,花费有多少?据说是每年4千多。。。
   看了以上如果你还是想要知道步骤,如下:
一。用Vc++6.0新建工程里的向导创建MFC activeX controlWizard,细节不说了,根据你控件需要了,略有不同,问题不会太大。

二。你控件代码的主xx.cpp(非xxCtr.cpp)文件中添加安全接口函数,否则每次运行控件时IE都会给出安全提示,很烦!
#include "comcat.h"
#include "Objsafe.h"

// 本控件的CLSID,注册表用
const GUID CDECL CLSID_SafeItem ={ 0x7AE7497B, 0xCAD8, 0x4E66,
                      { 0xA5,0x8B,0xDD,0xE9,0xBC,0xAF,0x6B,0x61 } };
// 版本控制
const WORD _wVerMajor = 1;
// 次版本号
const WORD _wVerMinor = 0;


/////////////////////////////////////////////////////////////////////
// CICCardApp::InitInstance - DLL initialization

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

    if (bInit)
    {
   
    }

    return bInit;
}


//////////////////////////////////////////////////////////////////////
// CICCardApp::ExitInstance - DLL termination

int CICCardApp::ExitInstance()
{
    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 HKCR\Component 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] = '\0';

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


// DllRegisterServer - Adds entries to the system registry
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(CLSID_SafeItem, CATID_SafeForInitializing);
    if (FAILED(hr))
        return hr;

    // 标记控件脚本安全
    // 创建脚本安全组件种类
    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;
}


//////////////////////////////////////////////////////////////////
// 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(CLSID_SafeItem, CATID_SafeForInitializing);
    if (FAILED(hr))
        return hr;
    // 删除控件脚本安全入口
    hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
    if (FAILED(hr))
        return hr;

//////////////////////////
    return NOERROR;
}

三。添加自己的代码到控件文件xxCtr.cpp中,这里最好通过向导添加View->ClassWard->automation。

四。编译生成你的xx.ocx控件文件,这个文件其实就是个DLL函数库,只是后缀不同而已。

五。制作xx.inf文件用于之后的空间打包压缩。红色部分为需要根据你自己情况修改的地方。
[version]  
signature="$CHICAGO$"  
AdvancedINF=1.0  
[Add.Code]  
xx.ocx=xx.ocx  
[xx.ocx]
  
file-win32-x86=thiscab  
clsid={351FC603-D784-4B8D-BA2C-33C212EC5BAA}  
FileVersion=1,0,0,1  
RegisterServer=yes
  

六。打包压缩成xx.cab文件。你需要用到给控件签名的一些工具:cabarc.exe、signcode.exe,另外你可能需要用于制作自己试验证书的工具:makecert.exe、cert2spc.exe。
制作根证书MyCert.cer和私钥myKey.PVK:
makecert -r  -sv "myKey.PVK"  -n CN="xx Electric Industry Co. Ltd."   MyCert.cer
CERT2SPC MyOKIcert.cer MyOKIcert.spc
打包压缩空间为xx.cab:
cabarc -s 6144 n xx.cab xx.ocx xx.inf
数字签名cab文件
双击signocode.exe文件,图形化签名,注意要通过自定义选择自己的证书和私钥而不是选择系统已有的。

七。在你要用空间的Web上添加代码:
             <td colspan="2"><object id='t1' codeBase=/UserMode/xx.cab#version=1,0,0,1 classid='clsid:F3530445-A287-4A0B-AC3E-C4AF2B63EBA7' height=0 width=0 ></object></td>

八。调用控件内方法。通过javascript直接调用控件对象的方法就行了,比如调用空间中存在的一个download()方法: document.getElementByID("t1").download();

八。客户端使用,其他人从网上下载到你的控件后,如果是Window XP系统的话,需要先导入证书为可信任(详细到Google上搜索导入证书,很容易),再安装控件,之后才能用;而如果是Window2000用户则只要安装控件就可以使用了。

九。控件的删除。Internet选项-〉设定-〉显示对象,直接看到你的xx.cab文件,Del掉就行了,注册表中信息会自动消除掉,当然你也可以直接到注册表中删除对应xx.inf中列出的键值的项。

十。升级。只要在源代码中更改xx.rc文件中对应的那些1.0.0.1为你的新版本号,并同时更改你调用控件的web上的版本号就可以了,下一次客户访问这个页面时会自动提示安装新控件,新控件会覆盖就版本的控件。

   以上仅供参考,本人也是新手,最近工作需要用控件才能完成一些功能,以上包含了我开发过程中碰到的诸多问题,希望对所有人能有所帮助

分享到:
评论
1 楼 jerry_zmq 2008-09-11  
您的 STDAPI DllUnregisterServer(void) 在实际调用中,是会报错的,然后仔细看了下你的代码发现,你在调用删除控件初始化安全入口和删除控件脚本安全入口之前就先删除了控件,所以会报错,所以我给你换了下先后位置,这样就好了,如下:
STDAPI DllUnregisterServer(void)
{
HRESULT hr;
AFX_MANAGE_STATE(_afxModuleAddrThis);

// 删除控件脚本安全入口
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
if (FAILED(hr))
{
AfxMessageBox("删除控件脚本安全入口失败!", MB_ICONSTOP | MB_OK);
return hr;
}
// 删除控件初始化安全入口.
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
if (FAILED(hr))
{
AfxMessageBox("删除控件初始化安全入口!", MB_ICONSTOP | MB_OK);
return hr;
}
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);

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

//////////////////////////
return NOERROR;
}

相关推荐

    Activex\web上用Activex控件开发步骤(MFC).

    ### Activex\web上用Activex控件开发步骤(MFC) #### 概述 在Web开发领域,ActiveX 控件曾是一种广泛使用的客户端技术,尤其是在Internet Explorer浏览器中。它允许开发者在用户计算机上安装并运行自定义编写的组件...

    基于MFC的ActiveX控件开发

    基于MFC的ActiveX控件开发是指使用MFC(Microsoft Foundation Classes)类库来开发ActiveX控件。ActiveX控件是一种基于组件对象模型(COM)的可重用软件组件,广泛应用于桌面及Web应用中。MFC为广大VC程序员所熟悉,...

    MFC ActiveX 控件开发指南(word版)

    总的来说,MFC ActiveX控件开发涉及到组件设计、事件处理、属性和方法的定义,以及与容器的交互等多个方面,对于初学者来说,理解并掌握这些概念是构建高效、灵活的ActiveX控件的关键。通过深入学习和实践,开发者...

    VC++ Activex控件开发

    VC++ ActiveX控件开发是Windows应用程序开发中的一个重要部分,主要涉及的是利用Microsoft Visual C++这一集成开发环境(IDE)创建能够嵌入到其他应用程序、网页或者Active Desktop中的控件。ActiveX技术允许开发者...

    标准MFC WinSock ActiveX控件开发实例

    在提供的压缩包中,`新建 Microsoft Word 文档.doc`可能是开发实例的详细步骤或源码的解释,而`标准MFC WinSock ActiveX控件开发实例`很可能是实际的源码文件。通过阅读文档和分析源码,你可以更深入地理解这个开发...

    VC2005开发MFC_ActiveX控件基础教程

    在本文中,我们将探讨如何使用Visual C++ 2005(简称VC2005)开发MFC(Microsoft Foundation Classes)ActiveX控件,并进行基础的测试。ActiveX是一种软件技术,允许开发者创建可以在多种应用程序和网页中使用的组件...

    解决ActiveX控件没有在此计算机上注册的问题

    在IT领域,ActiveX控件是一种由微软开发的技术,它允许开发者创建交互式的网页和应用程序。ActiveX控件是基于COM(Component Object Model)组件模型的,这些控件可以在Internet Explorer浏览器中运行,提供诸如...

    基于MFC的ActiveX控件开发(VC2005).pdf

    基于MFC的ActiveX控件开发: 在VC 下ActiveX 控件的开发可以分为三种,一种是直接用COM 的API 来开发, 这样做显然非常的麻烦,对程序员要求也非常高,因此一般是不予考虑的;一种是基于传统 的MFC,采用面向对象的...

    基于MFC的ActiveX控件开发.doc

    基于MFC的ActiveX控件开发主要涉及到以下几个关键步骤和概念: 1. **创建控件项目**: - 在VC2005中,首先需要创建一个新的MFC ActiveX控件项目。这可以通过在新建项目对话框中选择“Visual C++”-&gt;“MFC”-&gt;“MFC...

    一个简单的ActiveX控件——详尽教程

    1. **环境搭建** - 首先,确保使用管理员权限启动Visual Studio 2005,创建一个新的MFC ActiveX控件项目。项目名称可以根据个人喜好设定,比如命名为"MyActiveX"。 2. **类结构理解** - 默认情况下,项目会包含三个...

    MFC ActiveX控件实现图片在网页的显示

    在IT行业中,MFC(Microsoft Foundation Classes)是一个C++库,用于简化Windows应用程序的开发,而ActiveX控件是微软提出的一种技术,允许在不同应用程序之间共享和交互控件。本教程将详细介绍如何使用Visual ...

    一个MFC activeX socket的控件开发实例

    开发步骤如下: 1. **创建MFC ActiveX项目**:在Visual Studio中,选择“新建项目”,然后选择MFC ActiveX控件模板。 2. **添加Socket功能**:在项目中引入`afxsock.h`头文件,以使用`CSocket`类。创建`CSocket`...

    基于MFC的ActiveX控件开发(VS2005)

    ### 基于MFC的ActiveX控件开发(VS2005) #### ActiveX控件概述 ActiveX控件是一种基于组件对象模型(Component Object Model, COM)的可重用软件组件,广泛应用于桌面应用程序及Web应用中。它们为软件开发提供了...

    书箱_ActiveX控件开发.zip

    《ActiveX控件开发》教程资源包包含了多个教学图片,旨在帮助用户理解并掌握使用VC++进行ActiveX控件的开发技术。ActiveX控件是微软在90年代提出的一种软件组件模型,它允许开发者创建可重用的、跨平台的代码片段,...

Global site tag (gtag.js) - Google Analytics