|
|
2001-12-20 microsoft
! ~. F$ N% A4 v- g5 q6 h7 N! y/ `6 y F9 U% ^
2 G, z! C- w- s+ ~+ m8 Q 如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
q, w; y- N0 P' C' x5 z$ L: T% O9 n: R% V `2 v
创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
7 n4 b& F4 W; X/ J) [( u9 X1 y; |* U; ^
在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 h4 w8 g9 d& ]! D
0 t' ]& i$ S* d1 b# H
下面是创建签署CAB文件的步骤 : " T* E. v* G2 C1 T/ k
6 V; _4 h: e3 d6 r9 }+ [% t 1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) ( M. l; F3 {3 A* X; |- u
0 M5 f B% t0 t d1 t 2 创建 CAB 文件 & L2 f: `. B' \
: T) t' a6 S# f% Y- i 3 签署您的文件 # C9 F8 K5 b- u2 ?6 n$ q
. H$ ?; s0 ~* a" [) [: r, T. q 4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
B% a `7 Z, v# f. U- C# q
& T/ a6 q+ D/ ?0 D/ ~2 n' ?; r/ r 在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
! z" J# m0 o! q8 t/ u8 O) I$ e
9 o: @( I& g! V. i* D* E8 N 有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
+ X% }" X3 k. Z
/ [" u n$ e" {' B 证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 : Z$ Q6 J. ?7 m9 V
: \+ u/ f5 S0 M5 j* X4 f( L& Y/ t& H
获得一个软件出版商证明书
# Y: C3 \* b- G8 W) [0 T' u. a/ F8 g. Z* f* ~9 v. {5 f
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 0 o7 G9 S! R; ]. F/ A1 ~/ v( F
; a% e2 K& U4 p! b% N' s5 x 比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
1 [0 e/ {$ G: t/ j4 s7 k
. c$ b7 c0 r Z6 p" _+ g6 mC:\CAB&SIGN\MAKECERT 3 m, ~) u# I9 \7 y% F2 A
-u: MyKey
% A4 o. c( Y9 L6 @( R r y# \-n: CN = MySoftwareCompany
. ?; d2 f1 a! M6 S" r$ c$ M; u& m) V-k: MYKEY.PVK CERT.CER
1 R& [9 v7 R2 s- {2 B' b, C& E' Y' E4 ~& w9 E3 R0 ~
MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
6 A% s1 ]2 `' c4 d# x
/ Y- w$ G% C4 p3 i+ F2 {# W( v 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: F1 G3 R2 r3 [8 B) _
+ v6 }/ I6 I! Y: UC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
[9 b9 \8 t4 H- m) _
$ E# `8 L# i0 E3 k0 ~* C 注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 4 c% E$ }0 Y' e% V! ~/ U
3 P2 K$ q$ |, i+ J$ y
创建一个 CAB文件, t$ L4 H5 C. j
( W. `9 Y* v# L3 M2 G' f% C* x
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
4 y: u/ S! @- e3 W$ E" M
2 B8 {- i$ @9 d1 A+ [1 c/ h 创建一个 CAB文件:
+ d4 T5 h; [( k6 y/ z5 U7 M
" E* L/ ?( J' k9 a! P4 E% S 创建一个INF文件。 % o C2 b7 T% `: B" C. A4 R
) D$ G' V9 |3 \3 R0 K 运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: : E& o) m$ }& v8 @. M, Z. s& v
# h/ ]& \) }! N3 [- |7 Y/ _C:\CAB&SIGN\CABARC -s 6144$ f) k+ v. I, W6 D
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF C' Q0 r$ R9 A" ?1 z; G3 C
4 [1 q8 ?& e# P* u1 k2 G0 p CABARC 创建了一个名为MYCTL.CAB的CAB文件。 # I& |$ J( e- V6 d6 ]3 Z7 ^ U
, I) N6 o# @$ p* {3 G2 R s
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
( J8 O. U5 W' Q0 z @0 l
( u9 m" A( v% N9 V( i' E( ]2 S ?' n -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: 7 q; @7 U- H! B
8 {4 r) r, d7 }) c$ C: d
C:\CAB&SIGN\CABARC 5 _) V4 q/ z7 {/ T
$ {; c" d* }' j) A" V6 _. ~ 创建一个INF文件
" k! b, d0 Z m' d, @1 \
, h. i; D* `1 Y* K: i+ J# H 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目录下的内容。 & z% W0 [0 q( q$ o* K, T
1 ? y7 P- h2 O4 h9 a0 _5 l
作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
2 J0 N7 ~4 |( x% i2 G$ e+ C& G; i0 e5 Z
; Sample INF file for POLYGON.DLL9 [, g' v8 W* i
[version] ; f8 H" S" x' e; g# \) e; ~
; version signature (same for both NT and Win95) do not remove$ R! t3 Z, x- g, h% t8 Z% n5 }
signature="$CHICAGO$"
- W/ B0 y' K" A5 X; OAdvancedINF=2.04 D- B8 o6 @& F
" c3 ?; A# L+ |, _1 T8 }" X' C/ R% F$ g[Add.Code]
" g* @0 A# o+ Jpolygon.dll=polygon.dll
( g) n4 l: H( @7 tatl.dll=atl.dll* ?. C/ P8 J8 ~: v! c$ k
5 A. w+ N' m% V$ a
; needed DLL/ G5 I1 P( m" K4 L' A6 w& p
[atl.dll] D0 ~, Y1 U3 d) _ C
file-win32-x86=thiscab: Q$ h, L1 B4 i0 S5 i0 u/ l
FileVersion=2,00,0,7024
% ~; E3 A- o: b$ T8 FDestDir=11; o8 J0 k% Q9 p& T# y
RegisterServer=yes
4 Y, w0 ], a' G1 N* l
' E4 }' U2 \; c7 A" ?' H[polygon.dll]3 s( G$ o- b H' K& M8 Z
file-win32-x86=thiscab
7 V" @# r, V$ e# I+ H" Wclsid={4CBBC676-507F-11D0-B98B-000000000000} 9 f! \: I' w3 R5 U5 O
FileVersion=1,0,0,1
' w! x# [. \9 m$ J* |+ b. BRegisterServer=yes2 X# A- A9 Y3 E" z
; end of INF file
I+ k' ~5 J2 B1 v
( [+ L5 r8 w. l9 h) d 该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如: # c+ E) R8 B- n2 I r
$ D6 e( ?0 j; T/ v) v, H
file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
7 z& x1 j9 N$ D1 X0 v+ D
+ e' p6 H. j4 E: G) j( [) _# Y# c Z 关键字"file-win32-x86" 指定平台是 x86。
/ C' w1 }" ]) V( D/ T: ]
6 N \0 g5 p5 v4 B; g) r. q9 _ 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
; z' e1 @* N& ?; w7 M% V! M, Q! J6 i1 O
"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
" m9 L% `- \! a
* W8 y/ h, j# G4 T* W% K2 p "clsid" 指的是要安装控件的CLSID。 F( V# X$ H7 L h5 t
4 I* n5 {# J& C& Z1 \- l
创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : + T" r0 x1 r4 R) F* n1 i0 h
/ N0 \: u' e, ?$ g C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF& p0 x- S5 x& D8 P% h, g) O7 U
! R+ K- c4 {+ A8 |$ p
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
$ F* F& J2 h2 C( N7 K1 I) q9 S1 G) r7 | m
有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
; e0 G* H8 C+ M O- w: `8 m" l2 C( g' p$ s$ J; N0 s; c/ _' |
签署一个CAB文件2 [9 Y5 \. t* S# r% Z
8 P( b) n) K3 l 使用Code Signing Wizard签署一个CAB文件: 3 x& q( c7 ?1 Q- l! D2 \# B. w
4 j+ z- N0 i+ g5 S- c 1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
/ g: H, y- C# G* M6 f6 ~4 N( p" ~2 ?7 d( P/ y
C:\CAB&SIGN\SIGNCODE; a2 r, C+ f: }6 x+ ?% t; i
" b+ k0 h2 Y7 }! a+ I1 x n6 \
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 . ~+ P O( R1 M
3 X, `! e/ G# f% ^0 m: u 3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
8 }: n+ j- f; `+ D" f: z2 T/ K! e, V- _( m+ D
4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
) Z9 H, e) z7 N8 i, l" ?
8 B4 h7 f7 X8 v: g W
1 L0 G) O+ B, t! s2 K* O) j 5. 点击Next,前进到下一页。 & x. P8 u6 N: d: ^
/ q8 X$ F }) ~( S. H- w# w* _ 6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 - ^+ F* b0 g$ f3 F( ~# j6 ]$ k; l
r2 {0 J2 B6 a! d
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
" c9 G0 X" {8 f& ]3 e+ I' M0 W7 V: N! |$ n9 p% [& h* h
8. 连续两次点击 Next前进到最后一页。
& i& H( r7 u- b
- n1 ]4 a; D* H; Y& G( v% M& u2 ^" X 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 $ \" J* ~- ]4 | r* S! H
( m( D' v' u. D, i$ K8 C 您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 - Y( c0 \% n+ K0 C
) S) a0 c4 }: y8 U 将签署过的 CAB文件嵌入一个Web页
9 B+ C' n. u2 w# x* M, T' M+ s$ a7 J: Q5 Y+ O- q
ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : # [/ }2 D! c8 ?& S
R: {; d Z4 r: B! K$ {
ID - 控件名称
4 W" h1 K t+ [/ |# F# f, h$ h
3 M# p5 |) |2 W, L5 c) N CLASSID - 控件的CLSID * }' x5 Q1 l! N+ ?
. t: }0 v, n& C1 i& i" D. M% T CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 3 }0 _. P. [& Q* J% n; g8 y
5 z5 r' X/ \2 N; f V' \ CODEBASE可以直接指向一个OCX 文件或者DLL文件:
) A8 ~4 w; `" {& _; M; a" I& K" }& z" Z
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
/ r, m7 N9 v% A; v! `* B" x# b5 d3 b2 N
因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
# u+ [) Q1 O" ~/ I% T( D% ~- c8 H( ]) X$ s; u7 @- ]3 c: W
如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
; f% b1 j) a, B: D1 z) s2 a* I" W6 P8 r4 D, _
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
0 I. n. u3 V, ~/ N( w! |- a O) q, J0 w2 a% O( v7 k
如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|