|
2001-12-20 microsoft
/ b% x8 N8 z8 G; Y# H) _+ c, q# Q4 k, X% [; H" P6 H4 Q
! ~* m, G( j6 a: R2 f* ?' A* `% f
如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
5 X$ _2 W+ C% R, B# @; q# ?
% s6 x \2 n9 N8 e0 g% b3 F: u 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
# R) ^' P# X7 P9 `5 C, u, @+ \3 y7 U: X/ C" H* g
在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 ( x% E' s- J8 z% w m# u
% _! [' B- T2 n# X' Y
下面是创建签署CAB文件的步骤 : # Z& ?( c$ u+ v
- i" d8 q; {% K. i3 q
1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
! w4 ?: s) w1 t* T
% J! @0 D. N0 s8 `& z% c2 X3 ` 2 创建 CAB 文件
5 }; S' j, m7 F# U) v4 o6 q. C: j- s$ i; ^1 H2 L/ v- T
3 签署您的文件 ' k, p) [/ k" a, H% n* ?
, G4 u9 ~' I N: M e% l
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
! R. m6 H: c b" h1 ~0 d
Z7 A5 T0 S. ~1 y 在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
3 [- { C; F$ _; y! v' J% P: q _8 \' H: x* E# X
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
0 F5 f$ K0 s* f }* t5 L2 }* U* G( V
7 D! r1 L7 H/ V# m 证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 & R! o- \$ x# L' S
3 k2 _4 }7 @9 [0 @
获得一个软件出版商证明书
5 I: \7 J% L# ^/ f" O. i( G8 V( J# n. _9 r
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 / O/ e* t' g+ C9 {
$ E- }. s4 L+ s2 l
比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: 6 p" k8 z" Z; M$ z, E
' F, W% ^( o0 d7 }3 b2 K8 d. {8 ]% n7 V# D
C:\CAB&SIGN\MAKECERT ( ?% j+ t9 I' Z7 t! U) w# k; g
-u: MyKey , }" D$ r" R/ N! I3 Y6 e2 ]' F
-n: CN = MySoftwareCompany
' ~4 ~+ O" u2 A" L' M-k: MYKEY.PVK CERT.CER 0 `* W7 O! S$ n9 d
4 q9 N% P. M) p3 g. r
MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 / |/ s2 K! f6 U& ^; X) n$ ?
( _/ g; c7 [+ X 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: * h: b1 U$ K% D. q
# B- N( Y; R) a4 ~* J
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC * G- S! Y N# \2 g1 X; h
# m, e/ o3 z: W 注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
7 ^8 F# B8 I; q2 x# m. u6 H+ H- ]
6 X. ]( t" ^7 z: K; \. ` 创建一个 CAB文件7 a2 L% ^8 f. [# x8 @+ \
6 A$ V( M( t- Q 这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 + O) V: L: V4 k5 D
! S- Y" G$ {5 O; j 创建一个 CAB文件: , i9 y$ o: N- f, w# S
( d% i+ W. X' f, J8 T
创建一个INF文件。
~/ O* E" U. {* r: p. k, r. D/ N/ p7 h, y! N# b. {' g, K
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
: o( k* k5 u+ @7 z2 E. P! p5 l1 I1 L
# A; B y. V/ g0 sC:\CAB&SIGN\CABARC -s 6144
5 x) q7 A# N; P. n' d1 `1 ]1 k. |n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
1 ~# Z3 k" Y" d! |; I
+ Q! p* `8 C9 z# O- Q CABARC 创建了一个名为MYCTL.CAB的CAB文件。
. A; m Z8 @ Z1 n9 K( \! |
; @: ^, T" y9 m- n0 [, P 您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 0 x! Q3 r. `3 ~1 D& g& M, p
) c0 l1 N: @# \8 g% d8 e
-s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
! f+ a9 h% X }' l" v0 s0 ?+ J! x, D6 l; W: f& U! C, w. n
C:\CAB&SIGN\CABARC
( t% ?# n& p! n- Q/ T @. L
& ~& H- i( g& t$ l* Y2 [! s) P 创建一个INF文件
+ G: e' H1 X2 A- g, b6 k. C" l% l' W, z5 p+ W1 D+ s
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目录下的内容。
8 R; i$ b, V1 x( @1 P5 |+ c! |% Q9 @7 q
作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
+ K3 T& y1 c; g7 Q" k' g4 C+ Y+ i9 M" N# {8 ~) l1 S! A
; Sample INF file for POLYGON.DLL
! c" Y9 Y1 I0 D+ p U% l[version]
# S3 k# e) `$ a5 R, z9 k; version signature (same for both NT and Win95) do not remove6 l/ {3 k9 D+ l- R! @* R e; n
signature="$CHICAGO$"/ F2 o9 g8 i8 t
AdvancedINF=2.0
: _, {0 D% A2 v" Y! h7 u1 J" b" r; I& ?4 D0 I% j! F' M4 s
[Add.Code]
6 y& b: G: y, ?polygon.dll=polygon.dll
& b5 B1 O3 r# x N$ M& O& C' {atl.dll=atl.dll
% W* o% M1 ~- A3 G! p- W8 O @: X+ x; b* S
; needed DLL
% W* l5 S2 Y+ o0 o: k" y[atl.dll]* r6 F- U$ `% L9 s l
file-win32-x86=thiscab3 c1 D4 L, ]1 y8 ~1 p M
FileVersion=2,00,0,7024
9 p9 O+ W! I" c& jDestDir=119 g k5 l( S+ T1 g. T0 N
RegisterServer=yes
1 f( V, y% x5 X
* Z% ?% m4 N# _8 o6 o- t% r& ][polygon.dll]
5 o8 ]) j* l% t; o0 v, _8 Bfile-win32-x86=thiscab; Q3 _/ N$ x, O) F% i
clsid={4CBBC676-507F-11D0-B98B-000000000000} 6 t3 I V2 O7 f! f3 m0 u" [2 `) H
FileVersion=1,0,0,1 - v# I6 R* T5 C2 w& U% J3 I# k
RegisterServer=yes
x+ d; ^. p% d. o/ V" |; end of INF file
, U: V1 t7 _. k( B
5 O4 I1 R4 A; Q L V L" x 该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
1 S- L) i1 B% }/ K1 ?
; m0 J+ m5 F8 H! o4 [ file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 1 O' B0 Q C" q- r/ e" b# V1 M
0 o- K1 c% i- G& Z/ F( p
关键字"file-win32-x86" 指定平台是 x86。 7 b2 I L; Z* Q; ` u _" u6 u9 c& @
1 N3 F) z0 x& {3 c# I1 r" y 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 2 Z( u3 I6 }+ @" `5 G! ~
, M. Z% X, Z! E% {, j0 o "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 1 c7 K8 m, A+ j, j0 m8 J/ r
# L ^1 m/ W i" o) f( c. S, a
"clsid" 指的是要安装控件的CLSID。
8 C1 l% S+ z2 j- @# ~# X4 h& R9 J% w K# S* K: E
创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : . w9 J3 z$ S) ]! h. J! a
* ~# ]; \# Y5 I) u( U C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF- c4 Z" G3 r1 j5 R& [" @
+ q4 m# e K$ d 该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 - Z6 s* s- r' g7 ^+ b+ F
[% R/ g2 i3 m
有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 8 B! n# C) E9 |
1 g9 R. u* D* z 签署一个CAB文件' V. L# S) }" v. }. L$ z* |5 _
* `! @. D5 x+ m. `+ u2 M 使用Code Signing Wizard签署一个CAB文件:
! G$ v3 P- z6 ]" L* H6 R3 { O. K* q9 ?% `4 k- w
1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 8 F7 c$ j `% m
; }5 @; ~5 I% z7 l+ ]( {6 Z
C:\CAB&SIGN\SIGNCODE
C* q, t6 O# G* s7 u' m' e2 V$ Q: ~$ ?, c* t! |
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 ) m* _8 z7 M% c* Y- i
4 F% `9 k% Q8 {3 g+ L 3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 ( E" }& O: O5 X, g" Y- l; W
: h4 k+ o. M- N+ H, i) w 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
( ~3 T" P" Y6 N' V
F a+ N5 j' i$ D4 ?" j3 P$ k
4 p) M- C2 X- |0 ^ 5. 点击Next,前进到下一页。 9 m- g! l8 s" i& ]. x; ^* i
& ?& D0 i) C4 v7 x: E 6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
8 _0 ]+ J$ O1 A% X- O8 h( U/ p' Y1 K& J' `- e5 E
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
& a5 I4 ] n. o8 l: ^/ \( d7 \ K3 C: r0 H& G8 H0 S* m
8. 连续两次点击 Next前进到最后一页。 , {' ^: B5 S6 a: D$ D
, l W; B* ]4 _# c- ~# @; h3 T; @& I 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 ' p- z W2 F9 {+ M( N& Z7 i1 c8 O
) e9 l7 m9 o% d5 m9 |# z" i% d 您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
% T- `' [! V3 @! W# q6 }. h4 |$ f
8 @) i/ ^9 l# z @: x: D* P 将签署过的 CAB文件嵌入一个Web页
& J- D! R2 u/ T- z. G# G: h7 Y7 o" P8 r
ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : 1 A' @! i5 v8 y3 x
! }" V- Z! c, W, S+ j( _3 q ID - 控件名称 ! z8 z, Z/ o! E$ F- z# |% d: g) L
+ O2 R: X- r: b o0 n; A. \# l CLASSID - 控件的CLSID 8 Q: l8 V; ?9 X
8 g: I+ Z% L, f: [' O$ \: S) k
CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 ! j- ?7 m8 }* N0 `$ j9 D
f" l4 n+ S3 }
CODEBASE可以直接指向一个OCX 文件或者DLL文件: , R5 r2 a6 q3 C1 w% w) A+ X
; s$ L8 { s! _CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
5 i) G! t" f9 O4 Q; c
2 Z& |0 }1 R# S- o; O4 r! g6 ~ 因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
, G# {4 r5 e7 F; I+ X6 G
0 h$ j+ L* x9 g( M6 n 如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: " V8 n4 V% \& ?
/ Q+ ]' z/ x: i8 u' S1 M- x0 E! w$ x- L
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
4 K8 C1 R4 y8 _( L( z0 w, \
?) o; J* F. O/ H; H% l; p1 b 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|