利用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