|
|
2001-12-20 microsoft! b# t$ @" X9 h- e: q% u, a8 F
5 F1 e$ f, g/ g
# w) y% {+ _3 L3 Y+ a! H; \
如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
! f+ N7 a: m9 S4 y5 A1 V7 x% z7 Y$ C
2 J. N' V4 q6 }! S 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
! o/ R \5 E, F7 X
: B) j1 j3 @. x9 k& { 在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
& N; C k# Q, i1 a5 b' O7 [+ ]" M: I0 n! ~ f* F3 ], n' m5 ]
下面是创建签署CAB文件的步骤 :
; t, v' F) Y7 s6 U5 ~# M; o' P$ q3 R; s& n9 C; @
1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
( T* u2 [7 ?1 P2 n' j& R3 n
$ L4 j4 j0 |& Z7 c 2 创建 CAB 文件
6 ~/ F( i7 G% |7 B
: c" ~. R* [3 w; z, l4 ~; ~ 3 签署您的文件
) w' R. {* J! a0 a- X' C
7 y; d+ E5 f; y: I# @0 ^7 L+ p' {& w 4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
! M- X4 O; o+ G) L- j
: g4 x z% G2 {, v, j7 R! K 在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 & V a7 I9 K% s, d" g; P/ }
. k5 n. l1 |/ E' \. t
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. & D# ~" ~ c3 e. g) Y! ]
' K& @$ t6 B) A( x$ J3 g, n, W/ R
证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
6 S; w* u% i- k3 k( O2 w5 T9 w' {2 c1 C* c
获得一个软件出版商证明书
9 i3 k4 f Y1 e3 L$ F5 C' ^$ g/ _ ]7 Q* U- E
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 " T& N+ l0 Z7 B0 b8 D
, }& g5 ?! y0 I* ^# `+ G 比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: $ E7 X. w+ `: V" W9 r
+ j& Z4 j" Q: f
C:\CAB&SIGN\MAKECERT 9 \1 v7 I7 H9 K9 G; b" k/ ?' V
-u: MyKey , V F3 o3 d, s% g
-n: CN = MySoftwareCompany
, F2 Y" C+ a/ Q$ {, C) k-k: MYKEY.PVK CERT.CER
# ^% D8 T% S! i5 v/ z* z2 k$ f
) Q2 H2 C& f% J, m0 y" h MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
/ Y# a# T# I4 |1 R# I L( e3 n3 c) B1 }* |$ L' Y" Z* F
做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: 8 l4 S n9 I5 x! O
! d8 Y2 }: y# Z, Z( Q5 V3 J3 c4 f
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC 2 H6 M. b( d0 y1 c! E* j. v1 k
& e- s! a8 Q( a' d- ]2 B t, ?. }
注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
2 ], Q* H" ], D# K# K6 M8 \0 o7 g3 T4 D7 Z2 ?
创建一个 CAB文件4 a6 v$ @; l8 O% b6 N
% V Q4 h4 S9 q
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 # V, d: ?6 g( `) g2 I# x
& a% ~- G- B; @4 f& P. R6 |
创建一个 CAB文件: " `* X7 F1 l }; E1 X2 W
: A3 t+ T9 K4 f
创建一个INF文件。 , i Q; y9 p1 O) \+ ?7 K
# k! k9 }) u* I) E8 B$ p 运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: ; r; Y+ G& Q+ ~: b$ ]/ @. G9 }
f4 @* F3 k6 `) O& V# C+ Y6 ]C:\CAB&SIGN\CABARC -s 6144
4 c1 G: L) H$ Qn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
! c( U! j7 o+ i! x7 m/ d* S0 U4 A: U5 d4 D
CABARC 创建了一个名为MYCTL.CAB的CAB文件。 + H& m0 m+ M B5 I
0 r2 b& n2 {0 N4 ]& G, n( {4 u9 e 您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 / ?1 w" h- w; B4 v7 i
$ W9 U) g' i$ [3 E% O W! F, s
-s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: + L c/ J9 g' f$ k/ G4 I
6 v' M& ?0 q0 f, @9 T. l6 d/ Z1 x C:\CAB&SIGN\CABARC ! |# Y, \( q b% O5 Y7 H/ V
& n1 f; i$ z/ l' b2 F8 I* N- J5 g 创建一个INF文件! F. \% p# W/ V$ D
! K. M4 o) D# L9 Q o8 u6 M: z
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目录下的内容。 * p2 Y+ G X& z2 {' I+ c" \$ b) l
" r& B6 D7 g1 o5 c, S, K
作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
) F) o! j5 \( j5 d# r7 j/ R( |: Y. v; D+ w8 n
; Sample INF file for POLYGON.DLL3 E" I: t! [, p! E
[version] " w. I& D: H, k" J! E
; version signature (same for both NT and Win95) do not remove6 @8 _% e0 H9 E3 n- {! P
signature="$CHICAGO$"
9 [; m5 V+ G; t3 }9 W4 L6 mAdvancedINF=2.0
( B6 M1 F- P N# o- a: T
" O* j, c6 w# c# q[Add.Code]2 k* i0 C% [4 {7 F. j
polygon.dll=polygon.dll: k2 g# ~) a, \' D2 X
atl.dll=atl.dll
3 u- O6 X! _, i7 E/ x" c. w6 X: j- X7 L p3 d
; needed DLL8 t4 u ]$ J4 o0 g& r* l
[atl.dll]
) h2 H1 q" r) U; t$ j Ufile-win32-x86=thiscab* y" z6 d3 c( m. z1 c9 ^. \
FileVersion=2,00,0,7024' x( w* |- {# {, t3 h8 j: ^
DestDir=11
/ {! s: m- {5 e9 |( f' S: _7 [RegisterServer=yes + @5 k J% m0 X6 h, F+ x5 `( V
1 I2 Y+ Y3 m' n. m. s! g
[polygon.dll]
m' C0 X# u0 H6 Ofile-win32-x86=thiscab1 l1 U% r3 \( i8 { ]
clsid={4CBBC676-507F-11D0-B98B-000000000000}
' s; ]9 z _7 E, {# L$ ?3 ^' rFileVersion=1,0,0,1
/ N; _" T1 M1 [RegisterServer=yes- i9 \& t A1 F0 b
; end of INF file 3 d+ M4 T) Z9 A$ T3 @) A/ Z
2 M; X( r/ n6 @% U 该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
, A" g% d& K+ T1 N* X, @/ X0 Y5 n% k9 r1 d/ `% Z) t* W1 v
file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL ( a" a+ @! w2 a. _
7 e! _7 f$ S2 z+ ?( T+ K( y& m 关键字"file-win32-x86" 指定平台是 x86。 : K. B; T) S k* Y
% ^5 @# j' Z2 s4 r& |$ U2 V( t, C
得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 3 |4 R* x: t: v- y( O; ?
$ r, P0 Q8 s, R
"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 n* f" D; m4 Q) A& y( h/ }$ b
$ t/ i0 l ^7 C, f( B4 S6 w/ T
"clsid" 指的是要安装控件的CLSID。 & R# A1 z I# W$ n
5 K7 F" }& X) u: E9 j( O
创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
* A) |) L5 V1 [5 O; A( i w& Q5 f. |
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF1 [8 N6 _* A/ p8 T3 g- V6 q
4 Y( K3 o1 i a$ v" E3 F1 [9 N# G 该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 $ q6 Q+ {; C/ e: T
* }/ f& S6 ]* `$ g8 k
有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
7 J8 z' v- ]8 u/ k7 x- F* m1 t5 }8 w2 c
签署一个CAB文件3 q' L! j$ G# \$ b
/ v) ^- ~" {: T& h) `- b% {% I 使用Code Signing Wizard签署一个CAB文件:
7 t' a* `7 x2 _. i9 O5 d) ~. p7 H+ u! B
1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 9 V) c0 @1 F* W& |; s
8 `% Y D4 ]; r' R7 Z C:\CAB&SIGN\SIGNCODE, @0 D5 K! K8 y1 L
! Y/ G3 O. ]# R; D
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 9 S6 ~1 @- S6 l" a' a4 z4 A) r
* h& v& X3 u c4 N) T
3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 ! w* f# x5 o, ]( D
: n% ?% J9 T9 G6 `" e- t 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
' ^& d' M8 \ h: j4 ]3 w$ J( p. P5 v: ^
$ V+ v2 w5 d8 M8 { 5. 点击Next,前进到下一页。
# t, _: X, S$ Q" l
' S! W9 t$ q/ e 6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
3 a( r+ A) e' P% \& T5 {
( ?. F f9 E0 q* v9 _, y: l 7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 0 V! w# ^4 R( {' }4 P; i: ~
/ F1 H: C' L; K; B, i6 W
8. 连续两次点击 Next前进到最后一页。 ! q6 Q, V4 Z+ E& Y
& C* }- s8 v% _) c8 g- t2 s4 k
9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
9 a$ Y5 |4 T ]% }; Q' L; ]- B K9 [
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
5 t- B" h& H' d8 Q6 @' Y. Z' }
7 \' D T/ x! X$ ~- V 将签署过的 CAB文件嵌入一个Web页$ H% K4 {+ `$ W% N
7 j" N- J9 L0 V: z% ~ ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : 0 f! h" U7 O& C2 B; z) b
& q8 h1 V1 h+ Q
ID - 控件名称 4 P* g- P: m7 X/ ~. V
3 c9 g! M; |/ q
CLASSID - 控件的CLSID 7 y4 U [7 \ m0 y
: z. k) j) K: X4 Q+ e: o \
CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 2 i% c) b- l6 p" \7 }/ n# O2 I) E- i
j% i# G2 `# c8 t CODEBASE可以直接指向一个OCX 文件或者DLL文件:
$ l6 L# U; j) |8 y( I. A- ?5 U% ^! F3 l* w
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
: i4 {" K/ \+ e& i% |3 ~/ }/ e/ Q9 I- H; B. e) z
因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 9 t) w1 q# ?, o! Z
' ~( ^: T" P0 r& F: o% f
如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: 5 ` ~0 i. v) @0 P# N& g9 k
0 ~: }8 s. Y- D, s' O: }
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" 0 Q" Z! }9 w& u
( h. ^0 b/ F0 X' S1 q* K) t
如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|