|
|
2001-12-20 microsoft
* p: H' x$ C& I( t6 q: C, d- n5 Z S" }- J) B
* @" j2 F0 u6 ]$ b) r2 x
如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
* T1 B) {) Q& f3 ]% K# `. N
+ `# Q: {8 I8 O0 } 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
K* [- T9 e8 Q- n5 T5 T
+ b9 O4 E {: Y 在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 & u: [7 h1 E; N. x- ^) ]' B0 k3 H- m
9 l0 W' Y: O F( i9 v; [% q 下面是创建签署CAB文件的步骤 :
8 d8 @) F+ X: W+ y- Q
; ~6 |# M7 X7 d! P7 E. d 1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) 8 I+ n# K% N5 H3 _
: ^% Z7 I% Q. q! y( p& N) A% Y
2 创建 CAB 文件 j( \4 e# u7 ^3 C8 f/ V
8 y- n0 x! l; h# H 3 签署您的文件 4 L4 v8 c/ T2 F
" v6 U* X! z# C$ v 4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
- ~1 l& r9 o& b; z7 L! h, H' ^2 X/ p5 P( L# U2 O% i
在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
; @9 h* w7 Q: B) b& F+ V5 c+ r/ M* E, X7 e: v+ d
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
B' I, H; k! A! s5 d2 r/ A
4 u8 X. K. X$ @" g/ N* g2 E* x 证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 5 J) Z" o) x t/ e- h3 v! A6 q
; |) G: c( s. [ 获得一个软件出版商证明书
, `2 J" q& O" m( ? q- A1 i& h$ `, p
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 1 Y6 n" Z- i# m
, r6 ?6 O8 M5 j# y [+ ?8 {6 M
比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
! e% g" t8 I/ i! H8 g1 B
/ P }% j$ N/ X d! _C:\CAB&SIGN\MAKECERT " U8 V9 k2 V8 M5 a) F6 p
-u: MyKey % g: g; ^! i- S
-n: CN = MySoftwareCompany
y3 ?8 a7 f9 D+ J: [2 v& d-k: MYKEY.PVK CERT.CER
4 |8 t5 X. Y3 |3 o/ ~, {- [" s! L# U; @$ `
MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
: A( W9 M, H6 Q c
5 V; X9 e1 P6 D6 `! Q 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: 5 G) x! l0 g% x" | p
& P* P3 [7 e1 L8 J: ?
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
. J; ?1 x! I$ s2 W& J
8 N4 W2 L1 v& d+ Y0 s' w# S! R 注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 * N. d+ e. m8 I! W
4 t6 R' L) [# `( K: x n" T, N$ W
创建一个 CAB文件
4 z- L4 P n5 w" V# R" k+ Y+ Z/ j" R
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
( d( W8 D8 {9 J: z4 v! M$ B+ Q& _6 T4 y
创建一个 CAB文件: 3 T9 z% K. M7 W: d2 ^
& [7 n/ z' F7 F: \% q% d 创建一个INF文件。 # {/ V( o0 ~4 K( w% p6 \
$ ?9 d/ f) `* ]1 L& Z' G! P
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
9 F* r: B/ U( t! \8 r
( z; b K1 L5 G3 }) v/ K* AC:\CAB&SIGN\CABARC -s 6144
! j+ b% M4 K$ [" L, u) ~ D) ~n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
/ _3 l) y: x1 f1 K) w4 e& K8 Z4 G/ ]& x7 w0 L5 n9 [ A6 O
CABARC 创建了一个名为MYCTL.CAB的CAB文件。 / p, a# x- a$ A; ]+ C5 u/ U
5 W* C, t+ X! X3 M4 A% ^* v0 x 您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
5 p, n7 ~! q2 [, f) b+ [1 p5 {, _" k4 H* [. |% u: {
-s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
: ~9 w7 b- s( M/ C# F x- S- j0 Q
2 m6 A+ U/ N' K: [: T C:\CAB&SIGN\CABARC , C+ A# @( z2 v) f9 J$ {0 W
7 p, b4 @- N" }5 w
创建一个INF文件& \. \9 z% {1 L X
4 M2 }/ |. z8 i2 {* Y+ \, L
INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如DLL或者其它OCX)。一个INF文件就捆绑了CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。要了解有关INF文件及其选项(包括如何创建独立于平台的INF文件)的详细情况,请参考万维网站Packaging Component Code for Automatic Download,或者参考平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\INF Files目录下的内容。
# e* S; f# E& y5 O3 j
& {/ z* c% ]: }7 @& p* s 作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
* b2 g+ v9 z3 i
H) W% X% N; h0 F+ q9 m) s. Y; Sample INF file for POLYGON.DLL; |7 ^" S5 \3 @* t
[version] / b% n- x9 H+ B' k4 u
; version signature (same for both NT and Win95) do not remove) p% ^- V/ M% L, m8 E6 ?$ P5 ?
signature="$CHICAGO$"
. s( b1 V2 w3 D+ r; F( g Z( yAdvancedINF=2.0, n, ?% m3 D3 k0 y
" X* {: t* v7 Q[Add.Code]) o6 i2 q5 Z3 H( ^' b' m0 @2 j: \( [ T1 D
polygon.dll=polygon.dll B9 m! Q) W: ?! }; R8 D* o
atl.dll=atl.dll! k+ v1 W# T0 G, `2 i0 q
4 j2 H. S8 O' n9 W$ ~( M2 ^6 F; needed DLL7 g$ ?* {( n+ {7 W
[atl.dll]
9 ^8 K# B9 ?3 V; `1 ?/ nfile-win32-x86=thiscab r8 u3 ], }, H: c0 v: y9 D S( d
FileVersion=2,00,0,7024
0 m! A3 J( e4 ^9 `. pDestDir=11# F/ }- M* z: Z" @* T
RegisterServer=yes / F: Y4 q8 u7 C4 M8 h! H
& ~) e( w* z' a5 {% i% o[polygon.dll]. o* X. |+ E" }5 S6 R* ?
file-win32-x86=thiscab. \7 T- B" Y) _) h5 B& Z1 j7 S/ v
clsid={4CBBC676-507F-11D0-B98B-000000000000} . e& k% s H: h# W) K
FileVersion=1,0,0,1 e) j+ G& v- w- K$ W
RegisterServer=yes
3 ^+ {+ J" S% b' q1 j0 q7 \ G; end of INF file
$ W# `5 j4 p% Q& P9 G
$ J1 ~& N. V" O4 a 该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
3 }1 w* {1 S4 m. `
( ^! G# Y' y# l) c% g* j) S file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 9 H" N, E8 [; V$ S
; v' l0 P0 G8 Y* A
关键字"file-win32-x86" 指定平台是 x86。
! b$ C4 b. n3 W( _( K# K7 w$ w2 x7 D/ a* S4 g
得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
8 [2 ]9 j2 q1 C9 w7 O! q
2 P8 p% j9 b6 S8 z$ s! _ "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 % N3 ~5 E3 c1 b7 b
; s7 Z: X( D$ g6 v Z/ R* u" o "clsid" 指的是要安装控件的CLSID。
O2 ]+ M- E- W% l# F; `, Z! J3 v' s1 J d/ U
创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : 3 k+ v6 ^ ]- L6 q7 _ w6 d: a: j6 d
$ e7 i0 S- z3 o8 q# q( h- t6 C5 D C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
3 D v# Q. x/ n; Y" x8 f; V4 |- I& Z" m
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 7 R% M9 U' |6 C9 q& L% z/ r2 X$ s
# k8 X4 v2 I; _6 L1 s 有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 ; U. a6 h' r% U5 ^( J2 T
. B/ @ Q }+ }' H5 f* N 签署一个CAB文件! \0 Q& J$ F' U& @* I1 K
9 _# t8 G7 ~4 L+ q& V2 k' d
使用Code Signing Wizard签署一个CAB文件: 2 i; Q9 g0 ~# L5 d
$ J( V3 ]1 y$ r; ? V5 | 1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
# z- E) }3 C2 M) n5 o& I- O
! B4 \- d$ ]3 m7 m! C" N C:\CAB&SIGN\SIGNCODE1 l @6 `7 e0 j. B% B3 K& n6 M
/ A+ ~8 A4 s3 z- K 2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
/ N7 d/ ~. h$ x
/ F7 P/ o$ W$ ^8 i 3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 / s* {& h0 V4 j5 ]( _9 w) ]: v
8 d D5 i/ q3 `$ ^3 Y& e, d8 |
4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
H: R6 w' a& K! u2 L" y* e8 i6 G1 h; D
/ f3 f' h! O$ f: [7 E
5. 点击Next,前进到下一页。
% d& ?! Z0 k2 j' f+ K8 _4 `+ s/ Z( ^* W2 @" d9 C& u! d
6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
6 T- n7 b/ m0 K, v/ V: d0 T* _9 x6 X' ?% w( v# g
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 ' Q$ m5 j4 T& _; E$ }7 b8 k
7 H4 K9 `- u5 X 8. 连续两次点击 Next前进到最后一页。
2 q5 L: z( t2 Z
5 x9 W! D8 S9 m! Q: X 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
. z# Y* `4 R" h2 H- Z
) c$ |8 Q! y4 S: \ 您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
2 ?3 f% k) Y& ?, Y
1 e% q# O: t5 n. Y) k. W 将签署过的 CAB文件嵌入一个Web页
4 l9 W; u) U4 u; ]6 t
9 `+ N7 s3 ]4 ]' F6 x ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
4 K* z& Y4 a! Q; G6 g' K9 U# v: l ~' G( W4 Y" ]0 w$ g
ID - 控件名称 + Y/ t4 J7 V% K7 ?: K
- }) s* u2 _# o
CLASSID - 控件的CLSID
6 x6 K4 E B8 m: V5 n4 y( ~9 @$ z9 {
/ L1 l" m) l C# W# ^ CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
1 ], a& n* i5 _+ X2 Z, M9 {
$ `% k8 b/ q# {4 Y, Z9 ]1 |" e CODEBASE可以直接指向一个OCX 文件或者DLL文件: 5 | a6 v3 Q6 B' ?( K
7 z' K! E" a3 [- }: H6 Y8 J
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
- S# I1 h: C& ~- v( j" Q
5 m" k5 s& M& b, p, f 因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 : b* I- n0 w, I! b V5 ]$ m
8 K9 R5 W8 n% c- Y2 t6 m 如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: 8 G) V$ F7 ]4 P% Z( v
: U3 W/ F" _8 ^- J, O- dCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
! a: h/ @" D9 y0 q
" q2 B$ a" c7 g5 L+ r 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|