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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
1 j" H0 L  A9 N6 r! M2 q% w3 ]" G
  _  E: X- N1 c" K- Q
% E) C5 X9 l+ t# z" z. \  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 $ ?7 Q# O' H8 |9 w

+ G( E6 t, E* u8 |8 j* F  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 $ H* m8 m; H# D

% y6 T* [0 `  w) u" y. {  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
# L% T9 j. ]+ o* S
4 y. O4 y1 F0 _  下面是创建签署CAB文件的步骤 :
; n5 p2 U+ _, t2 ]/ r/ V1 o) i" T# K' Q5 o+ a
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
/ T" \% f6 m- b  k, c& n. Q- X
7 e. i1 j& j! a) J   2 创建 CAB 文件 1 O8 ]8 y5 J* N$ f
  R8 r6 S0 A% d+ A5 k
   3 签署您的文件
& u* y4 R$ C$ |$ |% D8 ]0 g
$ k& p- D- C! C) Q$ i& C   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
$ ]2 H4 H2 ^  C; x5 l% `, S6 H0 ^! d/ G% Q# |/ I
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 $ E- L. l0 `! L( u/ W# m3 M1 o
2 U% r3 r& R- [, L. Z( M6 H
  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
! B" Z2 ]& Z6 }: m/ f8 d& z
4 z$ R8 f% \8 ?7 ~; O  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 / s% |6 B6 v2 \. n; o

  M: p* X* E6 _- ]2 x3 }6 d& E' K  获得一个软件出版商证明书! @6 @# Q, P; _3 u2 b

% W5 j7 Q$ t5 [4 ~5 M, v1 w' u2 h  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 - Q7 x5 H' G7 Y+ q0 {7 t; ]0 W

$ k, Q; d' |8 J+ f" w. z( m( g  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: 0 |' T$ }6 w7 a4 }0 }% w
+ c: C- E3 `- G! {+ W% P1 }+ ?* {
C:\CAB&SIGN\MAKECERT
1 m- g) x4 m. G+ C$ k& n1 \( B( t4 x-u: MyKey % }1 c1 ^/ ~1 L: i
-n: CN = MySoftwareCompany & B2 L4 S  o8 y6 `2 g3 F. a% R
-k: MYKEY.PVK CERT.CER
+ J, U, S, t1 I0 l/ P7 G* t8 Y- C' G; N+ q1 O5 I% b
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 " F3 Q$ V& t9 Y7 N9 M6 @* T
, u" H" W, J) W" Z& |. C! f
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
" V6 a) R; f1 y* o3 V" @5 Q
7 G' R2 \7 p: P- n) m) |! s0 TC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC 5 m/ I9 Y9 S" y- b1 W
" {; F" w) f" G5 v4 h* i
  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
3 t- G! ]& j& L( O% T
. k2 y% \+ C: K" d7 a2 j+ r! ?$ u  创建一个 CAB文件
7 `2 {$ x, X: {$ V) ^+ y2 G+ Z8 \7 y& Q0 O7 Q
  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
3 u1 v6 {5 G+ T' D' Q8 t1 V
/ z: g% \8 [! U* S" S  创建一个 CAB文件: 3 {3 g) X, y) T8 S  @# F, G% K  O

- W5 A; U! e* p' Y8 m4 ^  创建一个INF文件。
4 Z5 s7 Z& v; D$ _3 i/ P) R6 B2 x" j+ b  K- `
  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
1 U# k& l5 ]) O/ T2 x2 J+ e
3 R+ R* Q8 ^9 `: p0 dC:\CAB&SIGN\CABARC -s 6144
4 \; K8 J* n, Q3 y) Zn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
2 M% _) |; [8 F# E/ I5 t
* }& D. k7 v% R- [. w) ~  CABARC 创建了一个名为MYCTL.CAB的CAB文件。 3 o1 E7 Z: y* @# R

$ x3 i! k# R9 c  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
0 o9 ], W/ u2 ]7 r" Z8 S2 m( F" S. d$ ?& [/ H, p0 t
  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: . X( j# H9 V5 ^

# ^% e, h* n7 a, |  C:\CAB&SIGN\CABARC
4 h+ m& Z& E5 D' [' \' H
7 u( j1 G6 u! v5 s8 Y  创建一个INF文件
* P  r7 I* o; F" |6 `" f9 T2 }  r
4 g# s* 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目录下的内容。
8 D  p) z) Z5 K' N. i: f: U5 ?4 u% B- w* A0 C. C
  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
9 X% K2 ~/ {$ ]3 l% s9 o6 O  o* |- f6 x3 n" I- O
; Sample INF file for POLYGON.DLL
" O9 K: z' L1 {[version]
6 k; |7 L4 d- M! [+ A6 X$ K/ e; version signature (same for both NT and Win95) do not remove
; X4 A* s1 b* t6 l! @signature="$CHICAGO$"
, {! L1 \, X1 N: R; A- w8 R) W- A6 ]AdvancedINF=2.0
  E/ ~: |3 P4 g6 u, Y4 m$ B, b) E# K  w0 [" S" R
[Add.Code], @" r, n3 c6 Q- x2 f: T  l
polygon.dll=polygon.dll
" z( e0 u- ?+ P! A, gatl.dll=atl.dll# r; a. Z4 R: [- ?
( n# V# o; X- [, o4 h3 U. \
; needed DLL2 U  \1 z% c$ K+ i
[atl.dll]
& O6 q: d, {3 v' c. t: U+ ]file-win32-x86=thiscab! |/ x3 W1 u0 p0 b$ t4 d
FileVersion=2,00,0,7024
9 o0 a7 K. o) l/ v5 z% L! ^( @DestDir=11
, ?: ~- T' r, t- ]7 zRegisterServer=yes
! M# M7 f6 y+ t! q! M: |5 @
$ g; ~* B2 |+ ~. j; L& y8 Q[polygon.dll]) g1 U3 ^8 G1 \, `# ?
file-win32-x86=thiscab- o* F, j% w+ I2 V# z2 L
clsid={4CBBC676-507F-11D0-B98B-000000000000} 8 ]! ]1 B1 k$ G- R$ P1 I+ s( E
FileVersion=1,0,0,1 2 f: t6 S0 n, `, n* `8 X
RegisterServer=yes
2 c" z( M8 a% ~- t0 b1 h; end of INF file / k( k" A0 j+ V2 b% W
4 ~4 q+ `: L! G1 Z$ r, o( u
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如: 5 ]% {) ~& i" V7 b6 G" g( D8 N
2 F# `' z6 P, g( W# D
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 6 Y9 X8 Q+ p3 i- @* l- T/ L

3 v( Y; V. Y9 N  关键字"file-win32-x86" 指定平台是 x86。
6 j/ Y# `' k* ^. S5 K0 q
* b  ]* S) x; |+ r  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 * P& I# h1 f% D+ L/ [
% T9 T$ U+ P  u; _( S
  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 ( R+ j3 c# U% A) U; S# {. f# `
8 j' x0 A7 b. ?
  "clsid" 指的是要安装控件的CLSID。
. e4 h; `1 x" Y  v
3 f1 Q' o3 m) d& l  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
" L8 B# J) ?2 b1 P* D% O# G% o
+ N: k) D2 z- P3 ~/ i7 q  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF, K0 ?9 q3 L8 \( l2 j  G" D
" b6 i9 ?2 P! }9 J
  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
; D+ v$ j. ~6 P3 u: z1 |: z
0 l# y( [, E, x1 H! `: K3 G: p3 }$ b  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 - J. [5 L, d$ l+ O7 E9 @2 n5 U
! `' T! O, u. }4 m% k& M' F9 ~
  签署一个CAB文件
' G: {$ Z1 H, l( \2 \5 i" u5 p
' _" ?+ [) e6 M5 r5 A7 q  使用Code Signing Wizard签署一个CAB文件: 0 b1 w* o# ]* {

5 P4 T, j0 [( }; X1 w  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 5 |( F4 p% H' c, K  ?& M

" ~; z! L* M* q3 w+ `( _    C:\CAB&SIGN\SIGNCODE9 L- |/ _, g$ W, [& ~3 h
4 Q) r; m$ J6 r) c$ W
  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 ' ^9 V7 [# ^& L( ~3 s9 \
0 `. i- i& u2 s, p. q" d  N
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
6 m0 K( H/ n* {- N5 D/ ]
" X8 Y. n$ B" U* g; r  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
6 H- F# z3 L, `( Q
9 S/ t. w! f* w* q6 e
0 U) F7 z9 W" j! G9 v) S- C  5. 点击Next,前进到下一页。 ; Y! Y6 Q! c, k* I" P  u
0 R7 g) n2 S4 m: B  B& J
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 2 s9 ?- t# E: ~' O
% x! [  p5 T* x1 B3 X
  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 : I) L. l1 Q% W/ T: M

1 Y' |( l: Z1 c/ M# d7 H# s% Q& N  8. 连续两次点击 Next前进到最后一页。
. b% m! X: q0 B( |
- d" u: Q/ P* y- ~4 K  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
- A# O: t/ K  d/ [* u3 O/ N. |# H% \$ G2 q  v; ]
  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
8 U- l* \1 ^5 u! y* H/ i' l! x" D! j
+ X/ \4 X8 `. F$ p2 C2 D4 y  将签署过的 CAB文件嵌入一个Web页
* c6 v6 k+ J2 ^' C( f5 {1 I4 [8 B3 l
  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : ' n1 T8 d+ V2 S6 W- [- R' o
* {3 X0 Z( z( K) L5 ?- k  h4 M) F6 k) l7 u
   ID - 控件名称 5 p; P$ g& B% V0 K1 F* V; f
/ @4 k2 e3 I4 T$ @
   CLASSID - 控件的CLSID
" [8 ~% p' Z, g7 \/ I& w) G% m3 E5 m# }- K& I* s( E3 j  G' T$ }
   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
& s0 ~; j3 |$ X, w% ]# t: G! `0 V" ~1 q/ N/ x+ m4 ?
   CODEBASE可以直接指向一个OCX 文件或者DLL文件:   S* h+ x! Y" v! K

9 L. ]. c, f+ gCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" 1 y, k) [; d& k5 F. q# L
+ o: c. b4 `; F/ }+ B; Y
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
% e  Z/ s' z  T' H: H9 R. ?  p* [
: }) J% e- g0 ^1 ?& d" h3 q  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
$ t% b4 T  Q5 D. W9 `! D2 D
6 `# Z% x$ m7 I/ @  r- \5 o4 ZCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
( p$ A" c& B& Y- v0 B
' r4 \) S5 A/ y8 U  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 22:49 , Processed in 0.037746 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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