找回密码
 注册
搜索
查看: 4944|回复: 1

为MFC和ATL控件创建签署的CAB文件

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
7 ?9 ^" L) S3 H; s& c* g, e8 g- b  H# X" s/ y5 P* Q' ?8 X9 T0 i4 m( h
8 i8 C- C) r) q( v: v
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 5 Y# D1 p& z6 X5 c! q# D
7 m$ q% H) ?, c, }# s2 r
  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
, Q4 N/ a$ K5 U1 K, P; }! {# D; a! ^2 G- n2 T
  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 & \8 p/ _! ?: i5 y
- D5 e! x) L/ I/ V3 }2 E; C
  下面是创建签署CAB文件的步骤 :
3 \  B% f3 w1 W: L1 q7 N
5 |* m4 Z* w  V/ B   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
3 {6 B$ E5 w, E+ K! z/ X& I6 c# A; c! U0 x- |5 f8 v" ^
   2 创建 CAB 文件 4 {& V. l4 c* b  c; \& p! |! t

1 a% X) ~* ^# P5 S6 B   3 签署您的文件 1 E+ t/ p. o8 ]. Q, C6 G

3 Z0 C+ I  A0 i/ c5 D; l) K0 V. H   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
- Q1 J/ r2 F! U: K2 p- w0 Y- r, \$ k! X
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 , X. l0 ^" h6 E7 z. z4 O& D
( [; {2 i) i; |( M$ O
  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
+ }% T! R! E! s) l6 ?8 q& S) j% c( q, {" n. D+ p
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 0 u% |8 h2 T) P7 {$ U0 v4 |8 [
& X+ z& f* ^. I4 d& b
  获得一个软件出版商证明书
1 H, ~+ r0 p% {) @4 O; \
- _8 C5 h. C; x4 m5 k; d  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 - y$ l% N' n  X* I1 c$ S" U
5 l7 B) }# j5 `/ _- w
  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
7 l8 M8 B) J4 P( D# [
: c1 a' w6 l1 q2 u. w# YC:\CAB&SIGN\MAKECERT $ l) d' @* N9 g0 Y# F
-u: MyKey : _- Q, P+ C- d
-n: CN = MySoftwareCompany , _" B. [. e4 J
-k: MYKEY.PVK CERT.CER / L5 y' o, t2 o% ^3 g4 M; j+ H2 X
0 _3 O5 @7 J) z$ Q1 Q
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
$ B1 f0 v' X4 T
, b' e* ^0 s$ T* G  Z3 c5 R9 Q  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: $ o( D4 }% v& f# T' |# E

- u2 i( o. X) ?. Q/ a& r0 wC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
; u/ z! v. u9 I' Z- j
: n1 B# E* a9 {% @" k( I  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 & B' G- q: h3 d/ @; @( t

- l+ x! \+ ^4 Z: {0 A  创建一个 CAB文件2 m7 g8 ?6 F5 {  e. q
, b9 z8 {0 G. ~5 \) d! r3 B( @$ O
  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
- @7 a# g, G% @) F9 b; p9 b( S: G: l5 a9 p4 }
  创建一个 CAB文件: 7 y+ a0 s+ `4 i" A/ S( I$ q- i
3 a; Q: d4 S# d: d# r
  创建一个INF文件。 # @' w6 e+ I$ l- m1 P. ?1 b, J

5 L+ T5 Z  L* {7 ~% {# x  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
8 a2 |; }5 m& E- [$ ?4 J. o
5 _7 f3 o9 o- G% f7 p: N) W! O, ^C:\CAB&SIGN\CABARC -s 6144
2 c7 h( I( t" m: p& g6 Xn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF ' S3 g% k" ~3 Q4 j2 s' y

+ n: e4 H, r) F  T, _* v8 f  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
0 E* z: r# K# H5 C, ]' P! T) X3 O+ ~2 X( k
  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 , u9 U" G- m* Q* ]. u* F: o% i/ V

+ b% Z6 P% J. T  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
- y+ t, B6 X, |' z3 f' k& V* M6 R2 j; d" G/ E5 p) N8 P& X; e0 s
  C:\CAB&SIGN\CABARC
) ?9 K9 N' E3 M' Y6 |
3 {" |8 {! ]# V: K5 _  创建一个INF文件
' q5 y4 a" j: y/ n/ g3 n: u/ F' z; U2 Q& b' W% g! w
  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目录下的内容。 . v3 g8 z* o) K+ U4 b9 |/ c: N4 h; O
. p. y9 b+ k) p5 ^8 X( z, J3 T" S
  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
+ E- F+ W0 n0 u; t% K, b2 u) b5 _; z7 v6 `
; Sample INF file for POLYGON.DLL
0 X/ l4 x8 ]) E9 Y[version]
- @9 A' {7 e* ~; M- U! U; B; version signature (same for both NT and Win95) do not remove
9 I, ?: H. E. ?" h- U% X, psignature="$CHICAGO$"& x2 q" f* b* A- W7 F
AdvancedINF=2.03 ^" T( L' E4 P
: h. o! y& F0 W3 t- L7 y
[Add.Code]0 s  s! N# N. x* k
polygon.dll=polygon.dll1 d4 R; S) t1 L: h. A' _
atl.dll=atl.dll
. r1 c/ l5 r9 t0 }1 W
- j  h9 r# n$ L; needed DLL
* J/ d/ r% L' D7 P[atl.dll]
, ^( H% o" U; a# H6 T: Afile-win32-x86=thiscab
2 x2 j+ _8 J0 O4 u' fFileVersion=2,00,0,7024/ q# q) {) P% \
DestDir=11/ F4 }3 k9 k6 w7 m. r
RegisterServer=yes
! Y8 t$ K( K) g6 W# ?9 j6 c4 j+ ^
6 |# L' U4 [/ c, x+ {$ i[polygon.dll]
" H. k" b( R' Q: Y/ B; z" |file-win32-x86=thiscab
* |9 y9 \5 v. r/ E" d% Jclsid={4CBBC676-507F-11D0-B98B-000000000000} 8 m$ b) D2 S% Z* i- o
FileVersion=1,0,0,1 9 u$ ^% V- p/ \2 ?1 _5 c
RegisterServer=yes
" Y# L, f  x. B8 n/ }5 s; end of INF file
7 \4 q4 r! a1 F) P, X0 v4 X; z. P4 e: w' O$ R) @
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
( W* E& B6 f% i
2 g, S4 A2 n# E1 T$ B5 f  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
  ]1 ]3 D1 P9 [' L
( Z! S; m  r6 v6 V+ H& Y. h  E" r  关键字"file-win32-x86" 指定平台是 x86。
+ r: I, |; B6 W  E2 ^3 z* a! m% P
  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
8 }/ q9 d, p) W5 a
+ A6 K! x7 D5 h9 ^& ?  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 - D3 ^2 K3 ]2 _/ q. a
  O4 E: p+ i* G# ^4 R8 K0 i6 h# g$ n
  "clsid" 指的是要安装控件的CLSID。
' b4 o3 g$ h1 e: d& b- R! k/ o. P) g' B2 Q# @  K7 X8 P2 L' Z
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
8 W# j7 c, m/ [% o' N. B7 n& C" b- E- o* X
  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
( B3 }* }4 z& C! \6 o( P0 }! g
+ }' N  {( w3 f% J, z: D: I9 X  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 : P0 O5 Q* Q8 C
  S. f0 }3 v9 a; I( b- p
  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 ; |/ w+ o% E! ^$ O
: @7 V1 T6 K7 C6 W+ V
  签署一个CAB文件
  p+ Q# m- @6 V8 Y7 p4 w% _& r! G# ]) z4 g8 d4 Y$ }9 W! d
  使用Code Signing Wizard签署一个CAB文件:
; X* P1 Z$ B+ c6 z5 e5 w, D$ I  d& [
  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 9 x. n* H! n$ T+ j& K- c6 A
6 z: N  B4 `3 K* }+ ^' ^
    C:\CAB&SIGN\SIGNCODE9 ?% {6 g5 v$ k4 D# F

, ^8 N" F; ~/ I1 e9 I  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
8 x5 f1 k; M$ t/ U# |+ E( {1 h& L$ }! ~9 i
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
3 w0 K3 u1 v) u! M; c, I
& O4 M& `* i( C) O' r! V& A3 h  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
7 d: P% d- c) a- p
5 E: f# P/ H0 P. |+ F, P: W& O- n
  5. 点击Next,前进到下一页。
4 r0 Q, T/ e' ?* B: `! V7 j2 G( J4 d; W: Q2 L( z# |( Z
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 % _( N* d# v& V4 u4 a  W

5 X4 }( k! h% K% }  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 ' Q  d8 R7 J7 w6 C6 p

% i2 I# N" u+ a' t/ U. @  8. 连续两次点击 Next前进到最后一页。
0 j( \: x: j. G3 j2 L9 R) e
9 u" N; _0 ^# n. r% u  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 $ I$ q  ^+ d+ d2 _2 I

9 l; @& S# X3 F/ Y2 B! [  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
) T0 T; Q# |4 `4 h: o7 D% H. `
! j4 y  O8 o  z6 C  将签署过的 CAB文件嵌入一个Web页* Y# D& d7 d' ^  A/ R2 ]$ |1 P$ k

1 u8 ^9 C3 N/ E  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : - u% E, ?3 w8 ]0 l& V

& J2 v% B# s. h   ID - 控件名称 ' t, I7 m+ B- C( A

6 J$ V* L& R- e) m6 t8 B   CLASSID - 控件的CLSID ; J4 M: t: s6 |
8 d2 v- W% Z) S, D
   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 ( L6 S; U* P6 E5 O
9 F* s9 Q7 g5 ]  d2 I
   CODEBASE可以直接指向一个OCX 文件或者DLL文件:
( u$ u: j+ ~. u% S7 |* O
) R6 ~7 k5 q* x: xCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
  y+ ~0 Z0 N2 R5 S( Z1 _5 i" Q# _- g! s: f: x3 h1 t* a
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
  C) j1 e0 ]8 I/ d
  L3 Y! _. y6 c# f0 B$ w0 _  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: 3 }- N9 a) Z' B1 n# a( |

7 n. d) n/ l+ z: A* S" PCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" $ v* S5 ]" v; T3 w3 z
1 S- @7 M7 y" g4 D6 T# w
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-11-15 01:43 , Processed in 0.019431 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表