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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft' n" m& I7 C& S$ V( Q+ Y
6 h; x" Q; A  l" E: n0 t4 w4 e: z( J7 S
& b1 E1 C/ ^5 E0 o
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
5 }2 U( O$ ^* w7 L! K
8 k: W* n- m/ ^6 z# |2 J8 P  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
; U1 Y/ S& r4 A- ]% `) z4 |
6 w4 q- H+ Q. z/ e* z7 M& k# F  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
+ \- u0 v9 m& b6 |, V( G
8 X/ o$ C, n9 k8 ^0 x9 P2 B- H  下面是创建签署CAB文件的步骤 : % C6 G3 F2 Q' k) q( r2 e
9 ?) H, ~+ e2 D( W
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) 6 W% U# V/ k* U

4 L7 Z$ Z+ x2 Z3 {   2 创建 CAB 文件 5 c* s7 f& y' W  Z

( x( R1 J. F; o9 s9 N   3 签署您的文件 9 m4 X) K  B4 B/ t) U
6 D) W- s, [. @+ J% q% Z& x, Q, I4 o
   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书   |5 c( _9 h8 ?1 h( N! e% M
$ D/ O: @# W: r+ G
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 0 m7 f' p; Y7 p+ |* `3 I$ c

( H% K4 a5 h' f( Y) H: w; r! i2 z$ W8 c  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. ' J0 z, s' t3 a& ]$ A" n) f( {  C
" W. D2 B- o- n6 K
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
  V0 v& W2 \5 c5 q+ K3 l7 G+ Q; `9 ~" N9 B5 e$ `
  获得一个软件出版商证明书6 J. ~( @" A$ s8 E6 P9 M+ h* v  G
5 {+ X" d8 g/ n+ H, b' f. N1 i
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
1 W5 H3 I* r* T: g. ?6 ?' |. w4 P5 g6 ~
  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: % @, Y/ g* W( G8 g) s1 L8 [$ v
' f5 R4 X- \0 u. M0 Z. \, K
C:\CAB&SIGN\MAKECERT ; m" k4 {6 ^- _2 g; l
-u: MyKey % I( r" i) [3 u5 d2 _) ^9 }  x: I
-n: CN = MySoftwareCompany / E& u, [- |& y4 J
-k: MYKEY.PVK CERT.CER
# }0 y6 o8 L+ ^2 I& A! W2 P& }% C# J: Y" k7 k" U% \
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
  _" k: @4 l% ~6 b4 }7 ^1 V* I0 y8 O7 e: y/ a$ T7 j+ m5 t
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
! ~) ?9 l3 ]8 V- r/ C4 K1 |# u! u8 p5 V' z! k3 \
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
  O  N& c8 R. L  M4 s) N( n' Q# M& V, i3 F( h# K
  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。   ^) i- V. F, a) z

) N- j8 @. b0 \  ^+ q  创建一个 CAB文件9 i1 L9 K( I& I
8 i3 q& T! k! |+ y* _
  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 , y* `: I* X( r* o" G6 @: l. ]
% B, B1 l6 e: n# C3 M4 A
  创建一个 CAB文件: + l7 T( u6 E0 a1 t: S
; U- \5 G) u$ F
  创建一个INF文件。
9 w/ w9 D' L; h) {! l3 ]
% R) g  T" o' L/ M: A  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 9 F% x( J0 _% D; H  m8 q, m/ B5 N
* {, j( F, F1 V; L
C:\CAB&SIGN\CABARC -s 61449 F  C9 L+ D- X3 D6 H* ~# H
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
- ?7 n: J3 z4 J! I6 W
9 ?+ X" T" v( i* H. r; z. X  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
$ [" X4 T; F2 U8 Z$ B$ `0 k
; M* ?: N" U) V4 r  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 ( Q6 V- Y8 f/ f2 ^

4 N" S! _5 d8 L- I5 }: D  Y  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: ' F  f8 \$ V# @/ ?
, @) `( F- H1 J: P" [
  C:\CAB&SIGN\CABARC 5 J1 d7 P0 X( j( p
# r2 q" w% ?8 j& \+ f% F
  创建一个INF文件
( Q, ?7 j- K' I3 O; {7 g2 m) l# C" f4 [8 j; b' Z; J- 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目录下的内容。   L. I; c6 O& K1 I& N5 q5 m; s

/ Q& `+ ?% w( Y1 }  f2 f  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 ' H3 \3 i) {, Z8 [$ h

, r  G) r0 |" j# J4 t6 v; Sample INF file for POLYGON.DLL
5 M" F0 h+ t( s3 W4 ?7 B: ][version]
9 ?6 r% x. m, d; version signature (same for both NT and Win95) do not remove
) J) P: q  t: S, Nsignature="$CHICAGO$"% `$ x0 ~* I  A# G# H4 d7 |
AdvancedINF=2.0
0 e! }! h7 l1 g) m9 m! v! z, q' p# c8 @1 u
[Add.Code]
) G0 B, c& y* V  z& @polygon.dll=polygon.dll
2 E% z4 }, J  [  D0 jatl.dll=atl.dll+ D" M( ]: `. l& t
  z4 E& Z4 y8 o- |, R
; needed DLL
; Q* D- {/ k9 @' m* ^. R& z' H% J! G7 K  H[atl.dll]9 _8 `( s! R/ W) U. y0 d) P& `4 j& R
file-win32-x86=thiscab1 Q2 Q. ^! ]6 W: R3 ?  N; P& [' O( A, z! i
FileVersion=2,00,0,70243 P1 v2 O. D; N+ J  ^8 @
DestDir=11
$ P0 V4 |2 d2 r3 L" K* C8 tRegisterServer=yes
" O0 G  W6 f2 P- X* q/ \# S
2 @; Z4 O+ g. ~; N! `) d[polygon.dll]
- N5 k* H+ M, o) Z" g% h8 qfile-win32-x86=thiscab4 ^& R9 `& n& b( g
clsid={4CBBC676-507F-11D0-B98B-000000000000}
" l0 _9 s" H& a1 bFileVersion=1,0,0,1 ' V1 V$ ]/ U7 v9 e8 j$ m
RegisterServer=yes) o2 q! \; C  _7 j
; end of INF file
0 c' p( m* k& ]! `4 {6 c% h: ~2 V% C6 e$ n7 W2 [! n
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如: ! _% M5 t7 P% G; V) ]8 W) L( h
0 V4 @# I; j. Q
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL + |% C: R6 S. R2 O' E6 C

, u1 e, p7 A& e  关键字"file-win32-x86" 指定平台是 x86。 $ q6 U) o: K. M+ ~

, V1 m2 ]2 e) \  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 ( ]4 n+ Q# M/ s- L3 ]
6 y- Y4 O* h- e& D4 C
  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
: k* Q2 s* u- d2 O- }" J, u/ I
3 w3 _) @! L6 r% u: Y# G; h' P  "clsid" 指的是要安装控件的CLSID。   g/ Z+ o; M0 C/ L( Z
8 q( A9 W6 h# I
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : 4 X  i% z7 t4 y& e/ G5 I

; Q7 D3 h' u- B" T; S; e  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
0 p3 r, S0 j( s
5 l6 v) W5 D) F7 f! q3 Y- q  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 & u8 P5 N4 k3 m: N5 N/ h/ t

; s# N0 n" D$ H, q0 C% H, t* w  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
7 n" Z5 P- N  e2 i5 D' z$ F4 g. r! W) B! v7 Z, t
  签署一个CAB文件
. {: c( z* C6 P& P, b. l8 T9 O7 Z& w6 l. y7 O
  使用Code Signing Wizard签署一个CAB文件: / Q; Q1 _3 e: j/ y) p; ]

- i  E3 P& `  p( W2 Y  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 , Q4 w6 Y% B  w* d/ l9 ^) V9 J- x

4 J( B4 |/ p' S5 S+ v4 R/ j3 y  \9 h    C:\CAB&SIGN\SIGNCODE# e" y6 f2 M$ [9 ^& g4 a+ p7 ~

5 R8 Z; B3 F" o$ _) h. ~( a: f  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 ' X7 ?' K5 t. n- h4 x5 v+ k1 C/ ^. W' R

3 i2 Z8 p1 |; _  Q) j4 K" R. k  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 ! t2 n* F6 M. N2 K3 q1 u
2 T5 a( v9 B2 I+ }; E; X
  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
4 Y3 M# R2 A2 @0 R
3 L) ]& ^' T$ i* P+ z
3 B7 f3 i" L' C2 c5 M  5. 点击Next,前进到下一页。 # s0 r' k3 w0 e3 O

  A% C, s! _' S" R) x7 ]2 N" a1 Q: O& E  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
; ~6 J+ O$ |1 i' n7 d) d4 H3 E3 o0 w5 U2 P' B/ ^7 k- U
  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 * M" {4 A+ E4 |' R: ^
& A* D8 d. x* z
  8. 连续两次点击 Next前进到最后一页。 4 o5 V& A2 U7 r& v" N. O
1 I" T' v9 h8 e) r% o. l, O+ A
  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
# }. B( x' m5 b& f
$ {+ s' S4 P  u  a  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 9 J1 u4 Q$ c! f: f1 b
& Z  O) ^1 g' C& `
  将签署过的 CAB文件嵌入一个Web页1 y9 S6 l  e$ q8 [7 c

- p- H& \5 c8 t0 \; I4 S3 |  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
- @& i0 |7 c* F1 X( @
) B1 ^$ q  C: b) C/ X   ID - 控件名称
9 y* f/ p( ]0 q* Q! m& ?# p% k# ~/ e- W: d8 o- e" l7 X0 @7 J! ~1 `
   CLASSID - 控件的CLSID
# [- K9 {0 I2 h0 s& H; u0 @
/ A' Y+ d: I% N6 v/ L   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
- X4 X- P" r/ x; H* F# R
6 r( s! W" ~5 R7 F- {   CODEBASE可以直接指向一个OCX 文件或者DLL文件:
3 ^  Y0 U) J( F
0 K/ {# d+ j9 ^% ~+ }: sCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" ; F' D& c' m  F* ~
/ p& `7 O2 U. ]6 I% B  k* \
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 ) x  ?. X) j* k% O

( E+ |& z, s2 O* s  g  Y# w  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
  x$ e: _+ F9 d# }2 T6 k0 p  n+ P2 ?3 B: l! a$ S
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
8 ^" N% ?9 ~5 ?' c$ h' k) Y3 g/ \! {' S# o  u4 f
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-13 21:32 , Processed in 0.024806 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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