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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft8 b& r& x* b7 P  ~: H& v

7 `6 f  L4 t& H7 W% S' Q' s1 f' t7 k$ X% y
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
; Y+ k/ I( l# v
7 o( R, ?7 z( {  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 " P8 m1 z- Y- {1 `" m
& P7 L1 u- j# A$ R7 b* w
  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 , _# x0 S6 L' p: G: d1 j. r4 c1 g' ~

+ P% Q- r8 Y* }7 {5 f0 ?! q- |* i  下面是创建签署CAB文件的步骤 : 5 e" M* a$ m4 `! J" f
7 U+ z' B# h; x# E2 c
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) 2 ]8 H7 x  G% v$ r) Z; y8 z+ ~7 }
( B$ Z/ U! @1 l& W
   2 创建 CAB 文件
% D) Q( |( {# a. c0 z5 K5 F! t; K
1 k! D% T, `* Z& j8 T( l4 f   3 签署您的文件
$ h. w4 {" u. o8 {' Z! p3 f
; N7 P2 \+ }$ \8 I; _   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
  x$ @$ k/ g5 N3 Y7 T0 n) o6 I2 Y% O" l5 U2 [
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 ) x5 @' i! b, l( k6 g

5 b- N  R, ~8 H& F, l* D  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
6 _' c: z$ K2 h, g
0 ?! p7 q% G  p. L2 |  V' J; i9 }  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
' Y( E. K6 H& ?- p
( `, `4 `# u9 @9 D9 L0 f) u  获得一个软件出版商证明书% x7 X, x6 K5 e4 }3 B; P) I0 w

/ i8 R/ D* C# m# f6 f  `# M* U1 _  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 7 u. h) l: U% j+ ^# j9 z

& `- V( k0 ]! H7 X  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: + R5 K4 s0 w  ?" O& T9 m1 f

, h$ H# z2 y3 i; OC:\CAB&SIGN\MAKECERT ( j1 i% `4 s8 D$ ]4 }* N" ~) S: S- _
-u: MyKey
1 S: G9 K% F5 E9 V  [# g5 L-n: CN = MySoftwareCompany 9 t! {  H: X4 Q& x5 E) G$ a! ^
-k: MYKEY.PVK CERT.CER 9 {4 E2 ~- X( x  B
# {! e+ c( p/ t4 k
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 3 w0 L3 T/ F) ?7 ]+ S. j- R
- m, I. a/ t# c' [- |' S+ r( g
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: 3 q9 H8 J$ B7 L* f

4 s$ q$ k# V  WC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
+ ]* o& ?3 H( H. w
' l5 o. b4 b* j9 N2 V# o9 ^: |  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 " m' f7 w8 D+ q, h& m( h
- `0 Y) ]" [+ X/ p
  创建一个 CAB文件# R+ y  V+ P. u3 m9 m

6 v4 W& K  Z& l2 F9 t5 i' |- s. A  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
% U: K! |9 }' d& P1 f& Y3 R! ?% m, F5 _+ T" v& w( S4 y" U8 l
  创建一个 CAB文件: / A$ N  y1 e) q+ i0 O5 a0 T8 V

0 w. m1 Y% g& n* u8 G  创建一个INF文件。
+ p0 I& L  c: {0 L
8 |9 d3 l, L9 {$ |2 k0 Y& S9 R  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: ! l% S4 C, k, ~/ R: X* u
! @' N: Y$ O- q( w% }( R) o' M" E
C:\CAB&SIGN\CABARC -s 6144& A7 D7 Q6 E4 z, ^
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
5 R. z  K- n9 b1 K3 U1 F1 [2 q- J- l4 u, o# q- Q7 e
  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
  E0 v% Y" ~. m; ~- g7 y( d" E. i% R4 z& T7 p
  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
- e) c3 t3 M) T5 E& L
  w% Q: l4 r! U5 W. W  n  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
9 I0 w, {* k# p% q" z# x7 q3 y" G0 S5 M9 V- a$ n
  C:\CAB&SIGN\CABARC $ [$ J! O' O1 F0 a8 y! p% I
- `6 b/ C8 n8 n/ b2 i2 q
  创建一个INF文件. P, K4 x& n0 D. P- a& H
7 i) p% j/ ?/ S
  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目录下的内容。 * C, P$ ]8 E0 j9 b, Q4 a! T6 F
9 S* I3 Y3 g. o3 N. y9 F9 R; b7 U
  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
7 Z8 Y+ h+ J0 Q+ Y/ U1 E: S
& O- y0 i5 W5 O/ G; F; Sample INF file for POLYGON.DLL# R; m) P. o+ W( D
[version]
$ T& d6 h& t6 b0 }% A8 Q- k/ M3 ~; version signature (same for both NT and Win95) do not remove& E: H$ H' u. o+ \
signature="$CHICAGO$"5 c& Z; Z. r8 W# C# j
AdvancedINF=2.0* y; g  W$ [6 ?( v: |% F6 d: j# I
! `$ x: o. N! i4 D9 O3 v5 J
[Add.Code]2 Y% h( q% l& L, E0 H0 ?. E+ Y
polygon.dll=polygon.dll
- W9 H& \3 H3 }8 e( M- H' ?; ^atl.dll=atl.dll
% F5 K+ E2 n: l8 N1 ?4 U+ g9 p8 A; A9 o) N% ~* ]" N
; needed DLL
: d1 m( W$ j9 t5 a) @  q[atl.dll]* B, k& Y1 l: k3 _& i' G
file-win32-x86=thiscab
+ f* ~+ J9 j. [9 h$ jFileVersion=2,00,0,7024
5 h6 c4 @: M4 d7 u  s7 {$ t$ v! |DestDir=11( W3 G2 @0 Y4 I" ^: Y
RegisterServer=yes % I0 I5 ^6 Y4 j& P5 |* U/ B
* Y  g2 b* i# V8 }* [
[polygon.dll]
6 k8 |" |4 M& O8 p8 g7 @8 }, C* ?1 ?8 tfile-win32-x86=thiscab" k) e, d2 V! z+ Y8 F2 \
clsid={4CBBC676-507F-11D0-B98B-000000000000} # o4 r- `9 w% d7 {
FileVersion=1,0,0,1
  m2 M- |+ R8 SRegisterServer=yes" O  N' _3 ]- c( w. \, M* b8 D5 Y
; end of INF file 8 h# J! J& q+ O9 h

- f4 E  A4 c2 j  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如: - n' t- n* _) b
: B! p6 m& k. V
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
- b) _) C; Q  s% T5 E5 D% Q3 b  t; A- J. ~$ b
  关键字"file-win32-x86" 指定平台是 x86。
& T6 |! K" E: N! q2 D! g$ u( A  r) f$ B3 t
  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
( {2 n- l) U4 }/ H* A2 S- W- n
' |$ S3 D) C" b4 h( Z  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
1 [* ?: i5 K5 [$ a7 Y! n3 ?# C
, K! R" |9 B+ u% W7 f  "clsid" 指的是要安装控件的CLSID。 2 M8 U# }3 p: Q$ g: t" N$ |3 {8 W9 Q, u
. p8 U) j( G% z/ m
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : 5 @9 E. f; r( k# x9 ]6 F4 Z
* Y+ W: K8 {* ~7 [
  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
' ?7 b2 r2 q! ?( {  ]7 T. v8 v* f# ]3 U
  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
2 B8 l: ~; i. Q# W" C
' V6 G; S  L) ]3 X  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。   P$ S8 ^* h" O* X' Q3 c( n" x
+ c5 V9 ?0 D# d" ?- \  s- h
  签署一个CAB文件3 {: u' l- F  C  h% V" o

  G) C  K0 o2 n: w  使用Code Signing Wizard签署一个CAB文件:
# X  \! {' |5 V1 Z! W6 |- m2 Z0 A! n7 k* u
  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 - {9 C( l* U& b, U- |; _

! h* K% {: o. x4 K+ G+ R, h! U    C:\CAB&SIGN\SIGNCODE5 r) H; V% \9 k

- R# N( p6 F" I; k1 v# ~" |  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
: P6 G% c& N5 V7 t7 S% v% G
/ P! L/ m) A  `7 G, b  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 * k- h, G+ O/ G; z

. {% L3 |& r- Z# F* J4 h% ~5 S  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 & w& Q9 y5 j: c) o/ c
& z* {% _+ _' u4 W& c
4 I1 B, Y+ t* z9 m( ?' d2 n9 h; {' h
  5. 点击Next,前进到下一页。
8 l# z1 F  k! y3 g9 y) s# H; H
# ?, _$ c  ]3 w! E& Q, G5 k9 w# X/ o  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
1 U7 U% q" }% G" j+ X" i; z9 S# @8 ^9 o* A8 B# [6 @5 I  E
  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 ! r3 y/ `0 e( b9 I
- B5 `( W" E: A8 o1 d8 j
  8. 连续两次点击 Next前进到最后一页。
4 F: y8 o: _$ e: m2 n- G
3 r& Z" l7 A; w+ G  x% P. b  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
, E3 S9 o1 E# ]' T; q* p
" C6 L1 F( X0 S/ H0 R5 z  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 2 r4 [0 m& ~- ~  L  J

" N1 }4 l, w! B$ t  将签署过的 CAB文件嵌入一个Web页
$ w! B: Q% R! _& D- @5 f2 v2 D: f7 J* O, j- B8 D/ y2 i6 j' s- a7 `( h- L
  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : - p. {0 z- R; O& ~  N

. ]% j. @# c; }( r) I$ H5 ?- M   ID - 控件名称 2 w1 r( |  Z( @+ {% L7 o" @/ o/ c
: a' e# {4 x+ c% w
   CLASSID - 控件的CLSID
9 P" X) C8 ?8 d
. w4 C3 f6 p1 x3 t0 N$ R   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 ( S& }3 c9 E8 s- i# t9 f

9 A1 t' K" ~2 o, t7 U$ ?7 T   CODEBASE可以直接指向一个OCX 文件或者DLL文件: : E$ H5 }3 e8 G* {3 O( C

  G0 n; L4 k; E4 c4 Z, N" rCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" " }  n' f* p# P, P
5 T' {9 v/ d8 S! N- r
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 ) l- i: q8 A$ E* s7 E9 `2 C

8 Y: Z1 j3 H- i& v( ?  b  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: 2 A# N5 V. w( i, j/ [

+ _& R. b1 L0 x8 r0 P5 c4 |CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" 4 O! y$ ]! h9 `" [
! F- w: j0 j4 _5 S! C: Q
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 11:02 , Processed in 0.016713 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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