找回密码
 注册
查看: 5312|回复: 1

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft  a5 r; I) _5 }$ \! h

) B8 M0 s& D8 X& ]3 l  M( d" ^* ^. s9 z/ i
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 - i, b8 h/ D- c% J; a

4 ?* ~. T  \! E( U, H  ^  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
8 g5 F6 u- j) X! j6 I' @7 G  F" L$ C+ ~6 @
  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
% B: o3 ]+ u5 c4 L+ T* z6 L8 q0 ~; S7 h1 B; [
  下面是创建签署CAB文件的步骤 : % [, n  I- c! \/ [; S/ |+ x
* O1 O7 ^$ C, Y" ?
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
. P4 J6 V4 m- D! K& X0 ]; X
* y3 P. R9 s# Q$ ~8 g5 w5 N9 W; R   2 创建 CAB 文件
* p, |" {* T( a) F' O" j) S1 u7 A+ W4 k
   3 签署您的文件
$ h& f0 S( l. b3 k
# t3 N3 N6 y' P- K# V: W   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 4 V8 y- J3 N# Z0 q
7 U! x1 F. O4 ?" S: o
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 + [9 y. \$ {5 c' \* s& z' S# |1 U
0 v/ K7 ^( S  q6 y" V) Y: ]% L
  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. : p3 o& R: I0 Q8 Z3 ?
8 N+ S. Q3 G' m' l, D
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 8 D, N+ F/ W* U6 I! u  C
/ m8 V9 l) u7 Z
  获得一个软件出版商证明书/ R. s  g# ^4 l- J4 t: \* K7 a
, d; j$ x3 t' P8 E! C& r" U  K
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
( Z! \$ O* i( l% e
! j/ z, L/ ]' n9 t) W7 \  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
4 j4 R6 W  ^+ u  ?5 b  B+ N" k! p  e" _1 q) e3 x/ f  ~4 B. k( F" F
C:\CAB&SIGN\MAKECERT
4 T3 _; S, R# H% H6 P) T-u: MyKey
6 ?! |; [% N* w5 m-n: CN = MySoftwareCompany
6 E$ C9 h, o0 b9 Z6 K-k: MYKEY.PVK CERT.CER . b- ~" D' @) ~9 _, v8 R: D# {9 [

9 U" {2 j& l2 O  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
$ r0 a! c' L9 b' z( ~1 O* M" G* P# Q' t- h$ Q) W1 X
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
; J; _6 S1 }, m% m! A: Q" h: ~; L  O; m2 d0 d6 @. P* L( h! M9 q2 [
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
& a0 O$ M' g' m! I* j. \
# I) p0 N( A  v) m. f5 x  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 ! h2 z. N; L  l& a  k
7 u% {1 N  P4 n0 k& D
  创建一个 CAB文件: W; k/ S2 l4 j  j

" e( C* b, D1 A% ?0 ]  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 & j5 t- K. }' n) R3 |
2 C; p! v' K$ u  L3 x
  创建一个 CAB文件:
& {+ h3 }' ?) ~6 w" v
1 j' P- P' J% K! F& L7 r  创建一个INF文件。 . E1 z2 V6 I" @3 X6 N

! W' {2 r2 b5 ~$ W; O  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: $ Z- o/ l' m! u
) d: @+ `7 z- v& O
C:\CAB&SIGN\CABARC -s 6144
4 f3 b' `+ W+ ?5 m- In MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
* n" J  [0 Y5 x, _- R* N! a. y* A  f% D" T2 F) }/ {% M4 M
  CABARC 创建了一个名为MYCTL.CAB的CAB文件。 6 T) t1 ~, N4 y( S7 S- J6 P
  ]: P0 E/ r. S" k9 m0 q1 |/ S, v2 a
  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
+ G* v& C' z, C& R& Q6 g$ v& l) a8 f8 ^: @" X+ \6 s
  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
5 k8 a- z3 [8 {# g1 `+ w* V# F) K# P* u& s% g5 D
  C:\CAB&SIGN\CABARC
. n5 }4 e# r# g3 J% h7 q  @6 o$ _
" A7 _. J4 x  A8 O  创建一个INF文件! H- M& H+ J% ~6 ~" V+ \

7 F& L, V" g; p% t$ S/ n  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目录下的内容。
7 k& [+ k! x( u: T9 M; ^$ ]! I5 j& y7 O+ M
  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 5 S% R$ b9 `8 V# I$ S  N2 l( \
; B/ P4 Z5 e$ P" {2 l8 J
; Sample INF file for POLYGON.DLL9 n1 X1 U* E7 p  A
[version] : |1 ^4 h6 u( B: ]: \9 q) M; f
; version signature (same for both NT and Win95) do not remove
3 `$ d% L% k  z& X. tsignature="$CHICAGO$"
8 ~4 @+ {9 z+ NAdvancedINF=2.0
4 \9 y  o% L' k) \! |$ F- X
1 V7 ?' z  O* c# B[Add.Code]
% Q% e, D8 w1 h+ y6 M: ]; h  \polygon.dll=polygon.dll6 E! C# ^7 j: e, ?
atl.dll=atl.dll
: h- M* t3 @2 m$ C4 K% {; H
9 v+ y6 B3 Y- g1 T0 A. ~8 `; needed DLL
6 @  ~3 G  o( N[atl.dll]
3 O0 t% x$ I* l$ z3 U4 G! Afile-win32-x86=thiscab$ t. N5 k  V0 z. c
FileVersion=2,00,0,7024
/ S* m+ M" S0 ~6 u' j4 `, P8 CDestDir=11* t1 W  |9 t9 V" x- l
RegisterServer=yes & t9 i1 m8 `" e7 j5 q
" \6 D1 R1 M# Z/ j
[polygon.dll]/ m2 ]5 T0 p( z
file-win32-x86=thiscab) d7 g$ A) Y; \/ l2 _6 i
clsid={4CBBC676-507F-11D0-B98B-000000000000} : Z! `2 ?/ e% ~4 \$ T; ^& D
FileVersion=1,0,0,1 ; f( W, J1 s) |8 m
RegisterServer=yes
$ R# m% ?" m! k4 o; end of INF file & _; |* S* k( ~+ f' A
0 \4 N! _* V+ V3 D1 d" p/ c- m
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如: 0 S( \- W+ ]3 B- H

: r) w4 F: g/ B* N% j# r! S0 v; X  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
0 P- A; m' F5 k/ C1 P$ Z) Y) ^* A) I6 M9 p/ k; |+ h
  关键字"file-win32-x86" 指定平台是 x86。
8 |1 H6 l5 O! x8 S& h* H' t. F6 I$ T9 f' o" b) h, e. \- e
  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
& }6 h# s9 Z! ^8 Y: h& A
9 W  f$ A6 G2 Q2 [/ H+ J8 w) |  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。   s; e1 F; ^! O8 V

( }) m3 r+ P) G4 l  "clsid" 指的是要安装控件的CLSID。 4 @7 X: S$ V8 o2 K, X$ C

( z& N1 c& R! N6 z  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
& J% O' |3 J# }
! h% }1 Z- o+ H; B9 q) S  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
7 l  m: Y* v! }7 {
( C+ l: [+ L; v- j  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 5 |3 W2 N  L: l  B5 @5 q! m
# D5 k" k7 J$ o) b
  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
& S% _, w8 N: T3 v& x9 k
* N8 j3 g$ q# U1 @: B  签署一个CAB文件
% \; o/ u4 F' i
/ p( v9 c# }9 v1 k9 C9 u  使用Code Signing Wizard签署一个CAB文件: 0 |7 Y- o( A" S  b9 Z7 t$ p
& O, o% H% b' Z; t& w  l2 w
  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 5 v5 d6 u" q( `

& J1 ]* ^: r9 W0 `. D0 k9 g  w( Y    C:\CAB&SIGN\SIGNCODE
1 l! T7 k6 \! S5 s+ P1 [$ _# O; d. B! A& N& N& B1 g; N
  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 0 B) `# G1 [! v1 a- K
! w7 v7 s  V4 u1 J
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
4 m1 \6 ?) Y) Q* q8 a9 }: R: E# X3 [- s
  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 : |' R1 b4 c' T, q2 r

& z: r1 I. z; ^2 {& ?8 o+ b' H7 B! |) H, O( Z
  5. 点击Next,前进到下一页。
) r1 A6 J6 S4 h2 O: k2 t1 j, z. E4 _" s/ O: z3 m, W* p
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 ; h' I5 k; K& U1 d0 S* m% S5 `

  k. {8 P! l" N  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
& B1 v) ]8 V8 w" E6 F3 y+ X. |  Q; S1 l+ g
  8. 连续两次点击 Next前进到最后一页。 , w+ ~; V/ {" V: {- W7 u1 @7 p7 R

. R7 [' ?: k& }; r  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
) N& @) Z$ ~( h( V/ g
! k& B) @3 `2 K/ l) I( d/ o: ?  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 8 f: U1 E! I4 V9 _% g/ F# C

3 s) t0 L2 C) S( }) y, A9 E4 p5 f, i  将签署过的 CAB文件嵌入一个Web页
# O' A6 k; ]! a; }8 l/ Q9 E! \- u
  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
3 J# E  A% H% K; F
1 d" g8 Z1 Q+ K8 A' \2 C( q' B4 r   ID - 控件名称 2 |  K) S( m1 {. J; `& D  O  k0 S
: L- u) k( f4 ^3 T* h
   CLASSID - 控件的CLSID " R& C0 K: P- r: c/ G- t4 o  D

& S7 h- P' T- T" L; @* m   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
, C; e( u: @' {- D5 l
& n5 G. j# W& f2 x   CODEBASE可以直接指向一个OCX 文件或者DLL文件: 5 o) \3 G4 l0 `  h+ Y' |

8 V" b. J1 W6 N3 T+ Y! e' @CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" , x8 K" r9 A1 ^5 Z$ O! V) s

1 n+ n/ t7 H% x6 _+ U% t  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 - H; t- J4 _  D3 D9 W

5 V5 ^2 H4 v+ B" u& t: L( \% Z3 K8 H  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
) G9 J5 Q: f  a$ m  Q1 {
+ ?+ ^( C6 |; {1 v0 UCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" ; D2 Y; ]  P! F, D% y& j
8 E: M5 p6 m" D0 w
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-1 23:11 , Processed in 0.017640 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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