|
|
2001-12-20 microsoft
/ @( E2 \5 s& M7 j" `! W+ O( }8 j( Z! R, v+ S
+ d# c6 W9 L- W6 V0 H( x7 J 如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 5 R+ y5 Y/ m' n, B' D
. }- i+ p7 ~% f* ?& R5 a7 j1 T' t4 n
创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 8 B0 G% ~. C2 l, _0 O3 x1 [
3 L) F3 J) O) G K* S# e
在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 . J0 Z5 \5 P& M) A( p8 Q( F
8 w/ c6 l$ p* N( O+ Y 下面是创建签署CAB文件的步骤 : 2 ?/ v/ X, Q# l1 X+ T) B3 Y
. M8 {, g, R: C' T3 @% {
1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) 0 a$ l, H: }# f/ X. M3 H. M6 ? ~! {
9 S, O8 q1 n2 E' W% b) @& L 2 创建 CAB 文件
& ?7 X' ?+ |4 U% ?, r' g+ a d6 v1 O. ~4 g' o1 S
3 签署您的文件 / _& t, ~0 D V$ f
! y; m/ J1 ^! H2 [* U- C' i7 R 4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
# A, f4 u0 u8 Y* C# r
/ _1 w+ f3 W/ o% _6 ^2 G 在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
' U0 T/ w3 O8 ?! k! n! t, k* s8 ?6 w+ n. l) H
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. ; B4 N# u6 M: D
7 X* C# G! [# Q- W" B6 I
证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 0 Q1 n" Q) E! V9 {" O( @1 k
$ Q$ u2 _/ I2 R
获得一个软件出版商证明书
1 z3 _) L6 E9 {. A+ L9 H% b+ g8 l# U4 {; O4 m& P; Z
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 6 i) M$ r" K# Y: ^" H. }
1 p; c8 `+ N1 V0 [5 ` 比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: 5 |0 g+ H. y, h5 }
/ D' D! J% ^/ }4 j7 fC:\CAB&SIGN\MAKECERT 3 H2 t- v: F9 C# ~- q/ N' k1 e
-u: MyKey
! d3 j: n8 f2 z* E% X }0 O-n: CN = MySoftwareCompany : I) p! n' |1 V4 Y
-k: MYKEY.PVK CERT.CER # U3 l# Z; M% f) r6 W7 A6 B. k
7 }) Q" q/ |! X) P2 w$ [ MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 5 f- j/ E4 |' T. r' ?
; z5 s: \! Z5 Z+ j9 Q4 T 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: ( l/ [5 m+ p$ ^' }" J$ ]
! V% `, q* ?- \4 `7 A/ KC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
; U: P2 {7 |5 Y4 ^6 B3 ~5 \% A! b0 g7 b- v: B0 }* r
注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
9 ^8 f" B9 G3 ]5 e* ~3 g. G% J- M! N! x6 b& R) r; a) j- x+ g0 m! }
创建一个 CAB文件' f) T; X9 }( c% {5 v. o! X7 ]
; R+ c8 F! q1 }; L
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 / w5 Q7 N' J# k% L$ X: [
3 s5 ~# c/ _3 b! l% `3 ?4 X
创建一个 CAB文件:
s' s& U$ i+ ` W( f
* w7 J/ h: x! J' K. m5 w6 I ` 创建一个INF文件。
. g6 |. A5 K) u) h9 X8 F7 ^6 x3 ^9 v/ K V! U
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 3 M' Y( f! E$ R- n( m P! h
& j2 _, O" g) t$ W s3 IC:\CAB&SIGN\CABARC -s 61441 B8 f% i* t; {$ ^) d- f) g0 K
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF 4 U0 l. ?& v( C
1 J( |& O: G0 B- {* g3 Y CABARC 创建了一个名为MYCTL.CAB的CAB文件。 " G3 u9 h7 g- ^1 S+ }% p
+ l* l6 c) c. B; j4 J
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 % N% Q6 ]* H$ Q2 n
% [% B' x t0 ~& v" |6 Q/ P3 Z -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
" b3 P& m, E1 e' A' W/ B: p* |! Z7 h- }2 J6 a* B5 T; A& `4 j
C:\CAB&SIGN\CABARC 0 n; E9 O9 {" s$ Y0 t+ |
( ^8 r: T$ f) Y6 `3 H% D' @1 F9 h 创建一个INF文件! n9 I% }3 n; [$ a
; q$ I; @2 Q( J/ y6 R9 g 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目录下的内容。 ! x. K) t: M; `$ ^9 V# l
6 p9 P/ z+ {& P4 U 作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
& ]0 \7 i5 \! |4 I9 R* e4 L, [( ~5 l! j" m: i* U0 |
; Sample INF file for POLYGON.DLL
+ d" ^$ b. M, K' q" i" L) M[version]
9 b; w. u1 t5 c" Y. d1 W& ~2 K; version signature (same for both NT and Win95) do not remove6 p2 A, f- i4 N7 L" p( m% Y4 @) f
signature="$CHICAGO$"
! Q6 i# D n( H0 g0 XAdvancedINF=2.0& _* w# E* O, b
1 n+ [+ O5 k) Y+ S; a5 T- w[Add.Code]
- ]7 D8 s4 m+ ?0 a( G$ rpolygon.dll=polygon.dll% o1 L2 O+ a# b
atl.dll=atl.dll
9 ?1 W# b9 ~1 G4 ~* t% V
' ]; R) `8 u+ C; needed DLL
. S c c, }$ d3 n6 `$ N: c[atl.dll]
& P* }! y, f3 J, t0 Cfile-win32-x86=thiscab
1 L- ]+ b# C! MFileVersion=2,00,0,70244 ~& j" d+ P9 r* |# _
DestDir=118 H- L/ [7 z/ v+ v% U- g
RegisterServer=yes " j0 t/ M( U3 e, G; M/ p
4 o: i% ]* v$ b% y
[polygon.dll]
4 O# q9 {" y7 \: E8 ]6 z- X% zfile-win32-x86=thiscab+ J$ ]; [4 |$ R, C. R% L" b1 R
clsid={4CBBC676-507F-11D0-B98B-000000000000} 5 O+ B: r4 E V$ X
FileVersion=1,0,0,1
7 x0 ]; O A# h1 k$ @* J, U' oRegisterServer=yes
0 b: Y B; ]% I. M% s& A2 ~- e2 d; end of INF file
5 |5 J, z( o; T: L& |6 N* `8 D \& ~- j/ f1 y, c
该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
+ C% E0 D! W9 B$ p0 s& }) Y% }7 i4 i; `# O( U" ^
file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL * B$ T6 C6 x, _ c; K4 ^2 X
. z& c8 x3 P8 P0 s- h9 T
关键字"file-win32-x86" 指定平台是 x86。 ( s0 Z1 Z5 \4 O8 ~* |: c5 H$ _
2 w W3 l& @; |* T7 E 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
/ \6 Y0 b1 R \0 C8 f. W
2 g. [0 L" H* o9 p0 K "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 + v5 P" n& l9 }2 w- \) Y, m
' c8 p. n1 m+ ?# T
"clsid" 指的是要安装控件的CLSID。
# b* E9 P' b8 u$ t `- i: s
6 p6 e" ~, m; S- ]9 u* a0 z 创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
# v4 v- K5 T& X$ F/ ? G# L. G; h# t! o. x& d) Q6 X( R3 d
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF: Y) O5 m6 M- {5 v. [7 L+ k
# |& t8 |5 k# h0 B/ u! V3 f 该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 . L# a1 n0 j* y8 @
# E8 ~) f$ ], v! j% @1 _
有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
5 {7 ~6 y2 O1 t7 j
+ f- C2 n% i. E8 F+ c 签署一个CAB文件% d- G0 d- B% W4 ?( D
4 c% E* P ^' R) b 使用Code Signing Wizard签署一个CAB文件: 9 E s; U0 F. ?
: g. ]" g2 a& b
1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
( Z8 E+ k ?% }1 o) O, h* _3 L) [2 Y/ l) g* S. K" u) c
C:\CAB&SIGN\SIGNCODE! _& w/ v6 E6 K5 _7 m
5 o& Q* N6 S% _
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
& U1 S8 F5 c# u& K2 ]- W0 R% \& V$ g. {' Z8 S! z9 R. L! `
3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
2 m, F/ ~$ w8 j$ f, c. y
# ~! B$ ]! @0 W4 R A* a 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
8 v: V+ Y7 f7 Y8 t2 z1 ? N/ R
}2 S0 U B, ^& E' o1 b1 T! A( G* }) Y! J9 G/ X1 w
5. 点击Next,前进到下一页。
- ^2 A! d) p+ i4 ]+ b M( [$ ~' t- v* L) e
6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
' N5 S# A2 E, F; y; v; _$ X4 I/ |. y+ _* J
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 2 j. R; N- q+ d1 v3 J- O6 v
' I4 c& w/ T2 b& W- D, @
8. 连续两次点击 Next前进到最后一页。
! a2 L4 m4 P7 d9 s1 L/ m. ^+ d1 S/ y3 p: \: ~8 ]$ R* K( U
9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 % b5 @; i$ I' ^: F6 {
. T1 Q7 d: T5 ?- | 您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
5 ~' P, E4 f; b4 r4 `5 U; G9 G3 n* ~- a8 s& W2 O* H
将签署过的 CAB文件嵌入一个Web页
! h, g7 F, T8 l0 Z/ {9 o0 G! p+ F
ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
; H h7 l3 u! _" t" b: _% [$ Z6 j# m& @! D. ?
ID - 控件名称
- k! ?5 ~! s1 b1 Y7 ~1 b4 h4 _
; o: d" D( H! s* u CLASSID - 控件的CLSID * w. k1 j2 f0 _% v1 d' f8 r' F+ S
1 X5 r2 i7 K' p' v( E' o% j
CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 0 H3 H% k% x1 X
0 Z" j0 H" h* |) b
CODEBASE可以直接指向一个OCX 文件或者DLL文件: 0 |7 d& d: `# A
. P. `# y7 c2 `! F X0 J+ o
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
3 B* v" n0 L' T5 O4 _1 }0 A. e6 M/ t0 a
因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
I- x; m, k" z) P0 M S$ A4 I# ^; e
如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: " ^' ?2 A/ j1 S9 \+ o# {
5 R' C, W) j" s1 T3 K4 d1 ]) V
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
& B3 `$ _3 Q- _2 n( w W' T
, {; \# T5 L1 J/ w3 u, M 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|