VC编程技术点滴(五)如何打包网页中的 MFC 控件

利用MFC开发的ActiveX控件要正常运行必须依赖MFC库。但是你不能保证你用户的机器上装有与你开发环境相同的库,所以,当你发行一个ActiveX控件,你必须要包证这些依赖库的存在。

    可以通过打包控件及其依赖的库文件来解决这一问题。

    在使用 OBJECT 标记将 ActiveX 控件嵌入网页中时,用于指定下载位置的 CODEBASE 属性可以指向 .cab 压缩包文件。在 CAB 文件中打包 MFC ActiveX 控件时,允许控件中包含 .inf 文件以便对 ActiveX 控件的安装进行控制;允许对相关 DLL(MFC库文件) 进行命名并提供位置;允许代码签名以及自动压缩代码以便更快地进行下载。

    通过这种方式,当用户第一次浏览你控件所在的网页时,它会自动提示控件下载,包括*.inf文本文件中涉及的OCX控件文件以及DLL文件(控件依赖的MFC库文件,ocx控件也是一种特殊的DLL),并自动注册控件及库文件,然后控件即可以正常使用。控件及库文件只需要下载一次,当客户端上已有 MFC DLL 时,则不对它们进行下载(默认情况下,版本号同用户硬盘上的现有文件相同的文件不下载)。

    下面以《在Activex控件中画图》一文中创建的Activex控件为例说明控件打包及web发布的过程:

一、创建 INF 文件

    INF 文件是一个文本文件,用以指定为控件的运行而需要下载的文件(如 DLL 库文件和 OCX 控件文件)。INF 文件说明都有哪些文件要捆绑在一个压缩的 CAB 文件中。

    DrawLine.inf文件内容如下:

    ; Sample INF file for YourControl.OCX

    [version]

    signature="$CHINA$"

    AdvancedINF=2.0 

 

    [Add.Code]

    DrawLine.ocx=DrawLine.ocx

    mfc42.dll=mfc42.dll

    msvcrt.dll=msvcrt.dll

    olepro32.dll=olepro32.dll

 

    ; needed DLL

    [mfc42.dll]

    file-win32-x86=thiscab

    FileVersion=6.6.8063.0

    DestDir=11

    RegisterServer=yes

 

    ; needed DLL

    [msvcrt.dll]

    file-win32-x86=thiscab

    FileVersion=7.0.3790.3959

    DestDir=11

    RegisterServer=yes

 

    ; needed DLL

    [olepro32.dll]

    file-win32-x86=thiscab

    FileVersion=5.2.3790.3959

    DestDir=11

    RegisterServer=yes

 

    [DrawLine.ocx]

    file-win32-x86=thiscab

    clsid={1D388D32-9D43-4891-BFEE-A775F78B9FBD}

    FileVersion=1,0,0,1

    RegisterServer=yes 

    ; end of INF file

 

    “thiscab”是一个关键字,表示需要的文件在包含此INF文件的CAB包中。也可通过指定一个相对路径,从一个 HTTP 位置下载所需的 DLL,例如:

    file-win32-x86=http://你的网站地址/NEEDED.DLL

    关键字“file-win32-x86”将平台标识为 x86。

    FileVersion指文件版本号。可以通过在 Windows 资源管理器中的文件上单击鼠标右键来获取文件的版本号。从显示的列表中选择“属性”,然后在显示的对话框中选择“版本”选项卡。有时需要在文件版本中额外插入一个 0,例如,在对话框中 ATL.DLL 的版本号如果显示为 2.00.7026。而在 INF 文件中,需要变为 2, 00, 0, 7026。

    控件的文件版本可以通过 Visual Studio 的版本资源获得。从文件菜单中,选择打开,然后单击打开为(Open as): 资源,打开控件OCX文件;所需的文件版本就在 FILEVERSION 后面列出。

    “DestDir”是文件要下载到的目录位置:11 指定系统目录 WINDOWS/SYSTEM 或 WINNT/SYSTEM32;10 指定 Windows或WINNT目录。如果未指定任何 DestDir(典型情况),则代码安装在固定的 OCCACHE临时目录中。 
    “clsid”是将要安装的控件的 CLSID。

二、打包文件

    下载 Cabinet 软件开发工具包(也称为 Cabinet SDK 或 CAB 开发工具包),解压缩后可以找到构造 CAB (.cab) 文件所需的工具CABARC.EXE文件。Cabinet 软件包下载地址请参见以下 Microsoft 网站:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncabsdk/html/cabdl.asp

    把控件文件、库文件(vc6.0MFC库文件包括mfc42.dll、msvcrt.dll、olepro32.dll)、打包命令文件CABARC.EXE,以及控制 ActiveX 控件安装的 .inf 文件(后面会详细说明)放在同一目录下,运行以下DOS命令打包控件:

  CABARC -s 6144 n DrawLine.CAB mfc42.dll msvcrt.dll olepro32.dll DrawLine.ocx DrawLine.inf

三、创建包含控件的网页

    DrawLine.htm文件内容如下:

    <HTML>
      <HEAD>
       <TITLE>test page for object DrawLineCtl</TITLE>
      </HEAD>
      <BODY>
        <OBJECT ID="OcxToolbar Control" CLASSID="CLSID:1D388D32-9D43-4891-BFEE-A775F78B9FBD"
           CODEBASE="http://localhost/testactivex/DrawLine.CAB#Version=1,0,0,001"></OBJECT>
      </BODY>
    </HTML>

    testactivex为在本地机创建的虚拟目录。

四、测试控件下载和运行

    将网页文件DrawLine.htm和CAB包文件DrawLine.CAB拷贝到测试用的本地虚拟目录(如testactivex)中,就可以在浏览器 中输入如http://localhost/testactivex/DrawLine.htm的地址来测试控件的下载和运行。在测试前如果控件已经注册 (编译控件时Visual Studio会自动注册控件),还需要取消控件的注册。注册与取消注册的命令如下:

    注册:   regsvr32   xxxx.ocx  
    取消:   regsvr32   xxxx.ocx /u

    注意以上命令要在你的控件所在目录(如控件程序的编译目录Debug)下运行。

五、其它问题

    如果打开网页是系统提示“windows已经阻止此软件因为无法验证发行者”,需要做如下设置:
    选择IE菜单栏“工具-Internet选项-安全-自定义级别”,在弹出的窗口中把下载未签名的ActiveX控件设置为启用(或提示),把里边有关 ActiveX控件项的有选择的都改为启用(或提示)。当然,这只是测试,没有考虑系统安全问题。可以通过为控件签名等方式来加强控件运行的安全性。

 

参考文献:

    如何打包网页中的 MFC 控件: http://support.microsoft.com/kb/q167158/

    为ActiveX空间添加Cab文件: http://blog.csdn.net/MLiang/archive/2006/03/17/626912.aspx

    Creating Signed CAB Files for MFC and ATL Controls:

    http://msdn.microsoft.com/zh-cn/library/4kex18w6.aspx

posted @ 2011-08-19 21:09  luoshupeng  阅读(857)  评论(0编辑  收藏  举报