|
|
2001-12-20 microsoft
& i% S0 L; i4 x k8 l& p/ X- m4 `6 V' d+ o4 `4 V' U; s
( B. t# _5 [$ y0 }& C
如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 # C1 C- D/ j9 e9 `/ k" s# s# c
" S! j" b; C" e( G& w/ j 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 % g3 U8 b6 q- v( S* E1 q
8 [0 L/ C8 a7 X 在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
+ k) C6 h% g4 y" B. `
7 P4 v* y+ ?% h/ p% h 下面是创建签署CAB文件的步骤 : 5 T8 u% C( Q- R8 Q n6 t
1 H' ^, [' \9 b) R1 _9 n
1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) * a: b( _4 C5 ^' r% B. _
+ M/ ~) {+ K' Q' M0 G4 W9 u: E* F 2 创建 CAB 文件 0 b: z# I, u9 e5 \+ ]# n
' [1 m7 J% v0 Z0 b 3 签署您的文件 " {+ I3 J i% r) T' t
" S/ ]9 y0 D1 d n9 P f4 P7 q
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 " {8 D+ X6 H8 ]6 _
0 Z3 y2 ^( B" d7 T6 N: ? 在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
. u( a# ^2 Z5 q$ u- `8 F
K) R5 ~" x% W& K, T% c 有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. $ Q+ e2 \1 J" ?2 }8 Q& }
/ N( @5 Z, K5 I9 R7 b
证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 * c0 x1 u! m- l9 F; P% h# _# n
) L1 L; M0 T1 L" o5 m! @- H
获得一个软件出版商证明书
. q/ _' q& R/ ?5 K0 V) Y+ ?3 t% n! k9 G4 [1 {* `
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
* z" R. P' e4 Q* g5 ]" ` \2 S7 j+ N( E& j/ g
比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: 8 j: m9 |7 t' L$ [5 P, w8 K+ D
* j! R! X6 E: b3 f: F1 d
C:\CAB&SIGN\MAKECERT ( R, F4 D! ?7 |9 k- `& _
-u: MyKey
! _9 T: ^. F' s' a5 k) ]-n: CN = MySoftwareCompany ' [9 c' i& x* e+ `
-k: MYKEY.PVK CERT.CER
+ s9 l, b- `" O: v) Z; e2 n1 w% Q% O
MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
- x% `6 B1 [# _9 O1 z
# t8 e2 Z3 K S: S0 `. q 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
0 u% E2 D$ i( |' b3 a6 A( F/ q/ @" \4 h0 ]6 _' u
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
' ^) [& ]5 e+ e8 T, D% ^, W: v7 w9 C3 e
注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 6 {5 t" Y) G$ J8 r; e9 g
- {/ e# [/ F1 e6 Z+ Z* D6 R6 G* K7 k
创建一个 CAB文件; @) V) p: P" H' ]
, _3 r# w K! G! H% W) n% N6 [
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
9 n7 Z8 F$ M; X% P5 d: k1 ^$ `/ v; Y# o% ]: i
创建一个 CAB文件:
8 _) K. A8 F* |2 F# \0 R0 P$ d# V2 j
2 w B0 u, {! E9 N* e 创建一个INF文件。
: N O( `2 I. d P0 M u" g
- L. p) p* l/ l 运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: * x5 j5 g1 I7 U8 N5 H* [
! }$ R0 t" C e; T. P4 |' mC:\CAB&SIGN\CABARC -s 6144$ C, r. {. j8 y- U
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF 7 E8 e4 ?' B* _4 x) @* N1 q( P8 a) P
- Y. _. S6 T0 d7 E
CABARC 创建了一个名为MYCTL.CAB的CAB文件。 ) u. z1 a; k' s- t$ }( d) e
8 ], ~; J3 X7 { O3 A$ J# g
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 7 L" J3 e) U, X) f0 b1 C. O' E
0 J( p! ~+ p& E: S -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: ( r Q# j' |% i2 ~- n5 P6 }' E( ^
, t$ G, x4 k2 h/ B9 {; H C:\CAB&SIGN\CABARC # A9 W8 R$ D/ |2 k* H( |
% u9 w2 j& E5 P' {" O% g. Q
创建一个INF文件& C& F+ q& w7 u% {
3 ?$ [/ E2 k7 k' j 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目录下的内容。
0 m* W" R3 B2 k1 I; h: {4 S$ T" G# c% c0 g+ t# y# L
作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 % d4 o6 Q+ z8 E/ ?' q, z
' k2 X. i' M& j2 i/ R
; Sample INF file for POLYGON.DLL- }3 @# U3 C/ @( V
[version] 2 R7 @ A8 j3 w" s, X2 D& |, m
; version signature (same for both NT and Win95) do not remove
& x6 ~' h/ Y; z7 N' @ n4 `signature="$CHICAGO$": o. l) }& z( w: W
AdvancedINF=2.02 s# H7 B- a9 u% z) Y x& [ j- {( M
Q2 T* W, b2 Q$ F; x, N
[Add.Code]5 Y5 Q: s. F: U
polygon.dll=polygon.dll1 z$ G/ b& f' `/ J
atl.dll=atl.dll
% b; y4 i3 ^$ J* y8 |
6 I" P% x' I2 U% a4 v% I. p* }+ i; needed DLL
( M; r* P5 q3 g[atl.dll]9 a( Z; V5 A$ N* t7 z& t
file-win32-x86=thiscab, K, G4 \. _7 p2 `
FileVersion=2,00,0,7024. K+ |+ U" A( F) ~( t. o
DestDir=11* n; M: |6 o% W. ?: F: `/ U- p
RegisterServer=yes # u3 M7 ?4 i+ R1 w& f& l$ V6 _0 p" f
, ~. A `7 e7 z" j2 k[polygon.dll]% `0 Z' K! f7 [6 ?+ i1 `; D
file-win32-x86=thiscab
) d- u0 z7 w z0 T5 Mclsid={4CBBC676-507F-11D0-B98B-000000000000}
, ^0 {, Z. K. n! j2 WFileVersion=1,0,0,1 ! `% I1 z( R$ I' z
RegisterServer=yes) E' A; [* U) `6 k1 |& E5 V
; end of INF file O" ~2 c* _3 S2 A! B
9 o( A, }! O: {
该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
4 u" j0 P8 | T; m4 i" Z F3 O V( f) C. \
file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL ' l% O. T/ u1 B, K$ b3 e
! V5 u0 z% z. _5 Z! X 关键字"file-win32-x86" 指定平台是 x86。
1 ?3 e: T* ^( B$ \1 d; i4 J
9 j' L4 b, {2 P3 k8 k) ~, ~/ j 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
- B- O2 [# Z1 k+ X! F2 E8 ~" a) O! X6 Q
"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 @) w6 H0 P* V( ~- R
, D9 P% y3 `0 a& ]; O5 g" ? "clsid" 指的是要安装控件的CLSID。 & {& M- n, e5 T9 L% L
( w# o# N7 p( T% D5 I/ K1 d* x 创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : 5 {1 ?* I. k7 G# f6 `1 S
1 m; A# u3 E, l) |
C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
( }/ N9 I9 J( @% j3 g$ |3 e% J, V
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 & ?1 y; N) G" |' S0 v L* G; i
. c) M: L( N4 Y2 t
有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
! y, R S9 l/ f8 S# G
) o8 a1 Q, M$ D" ^3 q 签署一个CAB文件4 O. \& J1 X3 j4 c0 l5 x' x1 Y
- o4 e9 }; \ n/ ~0 Z 使用Code Signing Wizard签署一个CAB文件:
0 L# s+ P" H6 Y- e$ r/ h- [& G. i/ G3 `
1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
% D4 o. |6 D1 k3 l) T
& s4 B+ ]* _7 N/ Z C:\CAB&SIGN\SIGNCODE
+ q; ?- }% ]# l2 r- X% O, E! n: [7 I& z& |" @9 f4 @
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
$ d+ m3 r& r1 j8 y# z5 a* ]3 h* @7 s: l p* V
3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
" P: a3 B' |- |1 P- q4 Y% W
( Y; F3 s$ v' Y 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 & ~% B+ j9 K. w/ a+ E, d- ~
+ I% B! l& ?6 S w0 Z
4 u; F5 t N0 f2 x2 w+ [ 5. 点击Next,前进到下一页。 " T/ Z+ u/ J$ j; q2 P6 B" }6 i' ]
+ ^# k: n G: q 6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 , E @6 Y [( O4 z+ z, n: l
0 f+ n% e% _* q k1 f# p 7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 - }+ K3 [- F0 L T- D1 A" w
6 h5 [+ K ]3 w" h9 h: X7 c! r
8. 连续两次点击 Next前进到最后一页。 + U$ r& O: o6 _- j O5 s. z
! G' v; h! t+ U- q( [ 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
* B- n7 D1 G; q9 Y: [' z" X" ] a
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 1 T* i5 X# `( y, e. G- {
4 Y/ F% K' @" N, `
将签署过的 CAB文件嵌入一个Web页
% T C- ?+ K& p* q, o( Z" u8 \
( B- d0 b6 F5 I/ Y ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
+ S1 D* q: L# p6 s; T* N% y/ f; Y3 d0 q* U( x; r# q; R% A/ Y; V
ID - 控件名称
N7 b7 d3 a7 \* t4 Z+ W3 W8 v
CLASSID - 控件的CLSID 5 C4 V+ l3 Z4 \- @: j
0 y# ~7 F: ]; P* X0 R S
CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 % \2 _, g6 _8 j$ o: L7 {+ K
& p* u! H0 L- U6 t1 L
CODEBASE可以直接指向一个OCX 文件或者DLL文件:
& n/ s4 n( f3 @/ F5 N0 l
2 Y1 T# M2 o" VCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" + m4 {6 Z' x4 O) D. @4 F2 _* Z
6 W/ S- D7 i: Y; k" S! {6 s( J& d' s
因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 * b6 C# v- p- @7 Y; t, q
. Z3 c7 O6 t* F0 u 如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
" T1 ^+ v! K& A
0 G5 v" K& Y( j2 t2 O1 ~5 q& sCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" + U$ U% s8 c* x2 d$ z5 Q5 o
: Y. W8 e- b, u) @) K5 q _) t4 H4 v0 R' X 如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|