|
|
2001-12-20 microsoft: k0 m C: p5 A# o! p4 J
. x* h% n0 @1 S8 C6 y2 y3 P
! B l- G8 C; `8 U4 [, x& X1 k 如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 ' e7 {4 O! c3 k9 t0 K3 [
- Y4 d' K- j" D) v+ \ 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 / L7 X2 A* }* v1 g( {4 C
0 h5 p$ E9 `' D9 z W0 L 在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 " [( {6 p, @6 W# L, m/ m
, R5 X% O: Y4 D. X3 M2 z+ | 下面是创建签署CAB文件的步骤 : ; H0 m3 H5 x) Q
. u7 G! R# j8 y+ \: d2 S9 l 1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) & n+ m# J% s# z! O
) O M. t) N+ Y! K
2 创建 CAB 文件 2 a, N8 w3 b7 t5 z3 L- e* J& N
% d' ^4 b: C& x5 T' ~; W! u9 `, t 3 签署您的文件
$ B- s3 H/ t8 I2 w" P1 ~
. |+ P1 G4 ]8 Z2 G: M 4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 7 |/ X! [/ K9 y* \$ U) B' P8 U9 @, C
. Y$ k! Y( z) k2 f) W- \
在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 3 i; I2 l. C+ i$ p; T4 @# r
6 m+ h. k `, ^: O! B! H9 I
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. 9 L! M$ k6 q% E8 L
) c$ R/ o8 G2 h# t/ ? 证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
7 W6 }% L; l; b
) V) Z( [- [( S: Z5 @0 E) w 获得一个软件出版商证明书' v; ^+ q K# W# F7 d7 |
" J: B2 ?. ^* T% o7 e' c6 t2 K
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
) \- R% z+ L# E" s) i$ t$ a; \1 m- Z9 j3 H: O0 d
比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: 8 T( `4 Q7 b" d
0 O+ A, B7 H& y7 v: q5 a$ U& MC:\CAB&SIGN\MAKECERT ( w6 N: _) x3 B( ~! Y h* j9 D% D2 W
-u: MyKey , h0 g9 X3 f W
-n: CN = MySoftwareCompany
7 O$ N/ t! Q, C-k: MYKEY.PVK CERT.CER
( `. N; q& O M' ~4 m
& f% o5 U' ], [9 f/ E0 m MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
4 D; m9 u L8 x4 x* @$ m7 B
6 g) v% _: O) f6 I 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
3 f; ? |* U0 E, m$ D8 O
0 T8 M& p& x& z9 c m! IC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
Y3 h8 h: v: i2 z, J1 B& [; B5 Q* R q; n: c l3 c- P
注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
$ r3 U* P' ^8 n4 v5 _; i9 B7 J" t- t
创建一个 CAB文件. F/ v1 {' l0 b4 b& C- B& i
3 ?1 b/ g& [! a
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 0 m6 @* f3 Q" b
& T1 E3 l" Y. u$ N! M! L
创建一个 CAB文件: 1 e5 e. k5 z# ?( j' B
2 Y8 B$ [2 S9 a6 `( a 创建一个INF文件。
: X3 u% u, N+ u- W" m5 O5 S0 Z1 F3 [
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: ' m1 H4 O+ g. P
+ T+ U' ]" c3 FC:\CAB&SIGN\CABARC -s 6144
; m( k) U1 G, {/ a3 Y8 K, J8 ln MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF * {( ~( J y8 P" i1 Y' j3 _
) D; Q/ \$ Q% ]+ ~
CABARC 创建了一个名为MYCTL.CAB的CAB文件。 , f, e' @$ I" o O5 K9 k. e
9 Y. m: {3 G/ k1 V# K# A! d 您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 % t9 [2 B2 N$ a
8 v' n( G8 h6 ?5 D% Y1 [8 b0 U% E
-s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: % J9 j; p" O7 g
. i/ E4 z" e, ^: R; b/ F C:\CAB&SIGN\CABARC / u3 Y3 m1 @& ]* r& O) ?; w
* H4 T2 V x& E1 I$ E
创建一个INF文件
5 E1 I) ~" G4 E; h8 Y, w' y
- B2 q& ~0 s/ @. H7 N1 ? 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 }9 c; t; j" p" Z! ?
% Q0 r5 n$ N% P+ ]3 o/ | 作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
' d" S& @6 S+ ^1 R- p2 q6 n3 S- q# U( x5 X8 {
; Sample INF file for POLYGON.DLL
/ y, d4 {5 ?+ }3 ~. O[version] ' f; q! G( d- ]* f# X, g
; version signature (same for both NT and Win95) do not remove
9 g$ E- r3 n* a% V; U6 S8 Dsignature="$CHICAGO$"( u: \' D6 e9 N- G2 r
AdvancedINF=2.0
+ j1 W& ]: V- `# i1 W
3 o% X0 J% S9 ]9 I2 l- J% b[Add.Code]3 O1 S6 s/ `9 L# H! V; @3 j
polygon.dll=polygon.dll6 C4 }$ T1 w) y" W8 n8 S
atl.dll=atl.dll
/ @7 b% u3 a, {- R
' X6 \ T. v/ M3 M" Z; needed DLL
3 |& {% n- O( S) p, C0 F2 w& a[atl.dll]
/ c1 L& r3 m0 v# Efile-win32-x86=thiscab
4 c% i) @1 W5 k' iFileVersion=2,00,0,7024
$ T, N; a! R' ~! L- Y- [: f& EDestDir=11$ S: l2 t2 k( z0 \ J
RegisterServer=yes 3 b. q) U2 R# X& g( _1 j: ]7 y
$ E( f% P$ x9 s: o4 W
[polygon.dll]
, t- k$ v9 N0 O6 Ufile-win32-x86=thiscab
% B+ y# o5 c, c: E# Vclsid={4CBBC676-507F-11D0-B98B-000000000000}
) y l# ]; m. {( `- XFileVersion=1,0,0,1
P# ~, b( t# P3 x' ~RegisterServer=yes
, p* j: p2 g- k0 U5 z( S* ^9 _* ]; end of INF file
& \: g; B# F: _2 {
; b! w, m" x- O @ 该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
: |3 G* F1 n$ c, `# N+ q
M" Z H% M# n file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 9 Q m# {+ n3 W5 u# e
* Q, \, @" w/ {6 n 关键字"file-win32-x86" 指定平台是 x86。 2 f" O+ P: @, b: [6 e( [. G
6 G) ]8 ?) I# O( h+ Z* a p6 u 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 1 Y9 Y# ?" C" d/ O4 n" a( _/ t( l
, d7 Z' V' G+ T \- X
"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
% ^8 W/ U4 z3 f+ K# ~& r9 h
+ ]1 X I2 Z n! E# h2 t( x "clsid" 指的是要安装控件的CLSID。
- A. F: r8 m y! ^
( y8 e! p) m% Q! m% B5 M4 _ 创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
( \( \0 N0 E- z' m8 P Y; k: B; L! Z5 f' x/ w& y
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF6 X+ f6 Q* e3 }+ B) I( y
+ N: q, ^& q4 @8 E& d$ w' R
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
. j7 j) b5 f4 u+ ^8 I- {1 l9 t
! _6 L* }4 l$ |' c6 x+ s0 n7 s/ T 有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
& F% K# A) U2 r* C: }* d# f, i/ u* r; A
签署一个CAB文件- O& Q% e* E7 t* n+ n+ v9 K
0 r J6 s0 E1 s6 M: J 使用Code Signing Wizard签署一个CAB文件: ! K8 e* @- G4 o; j z9 W$ r
2 X ^: g( Z$ Z8 a9 t% L 1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 , h+ k% N- F; s: u
( j1 B4 O6 @: s, p C:\CAB&SIGN\SIGNCODE8 q8 f0 e* f( b3 w
4 O1 G$ X' M% \! }
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 ! \' u) d" n! V$ a: o; C
4 o8 {: i& f4 y, C# B" ^ 3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
, v3 t" T3 G; Y
/ k; a5 q9 F, d6 ` 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
* o3 K+ q& q* c. S t0 F7 m
3 v# I% i3 F5 L/ |
) B* X F3 ]: e0 b2 ^ 5. 点击Next,前进到下一页。
* V8 K; f4 \ ?% t! Q& w4 L1 w- X$ A' H6 H2 d
6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 # H8 G6 T; t/ W- |- X) S0 T- ?, W
9 c/ l+ E" T" L! r7 h8 B6 u* P( r 7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 # a1 R1 \) n9 o) D R# D. H S
3 F. B6 d% ~/ h 8. 连续两次点击 Next前进到最后一页。
) |& _, D8 W# n {8 r9 V! M1 @8 h7 F' u- z
9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 : d6 a- ]8 i2 f; ~
, Z8 E0 A! O( Q8 [% C3 i: W
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
& p8 d- k7 ~- l+ A, n
' J6 T) Z( e4 i 将签署过的 CAB文件嵌入一个Web页/ L# i7 r8 X$ B+ M2 J$ `6 P
$ a0 M! V1 d5 I! ^# k4 L
ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : 1 C, l* J: j Y5 ]+ O* o
y7 Y1 x4 s; R/ i5 N$ f ID - 控件名称
0 V% m# h! ~1 |5 }2 W7 _* f0 z/ i* {5 ~. \7 n
CLASSID - 控件的CLSID + e+ `; ^! p1 J
8 ]. V$ m* w/ G1 p1 |( @ CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 * S S* B" F5 T7 E* T
. \* d2 C' L( M# S/ f" [ CODEBASE可以直接指向一个OCX 文件或者DLL文件:
3 g2 T% ?9 [) b
+ @) [% R' _$ j* sCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" % g( T' F1 _" |* p% _6 m; a
/ X# J3 w5 t: x 因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 * |, |' ~7 f& W6 c; c
6 Y6 D$ E( \: y) Y3 P
如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
) F* {1 l, z# d& }' D' O g% W( n+ \# e4 N; Y% T/ `
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
/ T v4 ?; J: u
( R- s3 n0 }9 O$ H 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|