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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft. a  g& ]! v! s9 L

; L' b$ i: z( R1 p7 a, ]3 t+ ^8 H3 u% L0 ]  \6 ~  |- f! m
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 4 z  y/ h' O; |9 d8 o  Y, e! D: |$ T

8 L% p6 L7 W3 s5 @" Q# d  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
$ k. @0 _  \# j/ G' r& z. c" T3 h, t2 L: ]  P
  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 : u$ s2 @  U; r" S9 p4 V. L% ~  x

; o% t  H, [4 s- E* `5 v' r' ]  下面是创建签署CAB文件的步骤 :
6 I! d4 C0 b& d# T  I" d
8 r+ l1 K/ U1 O' T0 i, V7 t   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
; _4 T. N1 O  p# ]# ?
  r, @0 z2 i, C" B) p: s$ f" O0 P   2 创建 CAB 文件 : w$ b6 b2 f7 @- i' M$ G% k

7 H" ?/ u1 p. M+ e, k6 U! ?   3 签署您的文件 . B& @- s0 ^1 G
: V, r( w, ?5 J& T! j
   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
' ^4 T1 i+ H) n0 \% Q
, `( u% X$ L3 h- M% G; h  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
3 q7 ?- K/ m: d/ r+ x/ |2 y* M3 ?. W- W9 m2 {/ Z7 _7 J3 c* y$ [
  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
6 Q) `2 j& e# M+ a, `+ x4 N5 {" F+ ]- G* H* Y  ^: r7 h
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 0 K' m; B# I) m! G' I& s! q( H

8 J: N) Z* b& B# `3 \  获得一个软件出版商证明书
3 h" Q6 ^  ]6 b; u# x) h' Y, j6 V4 t0 f( q) J3 P+ s
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
- K/ W, i5 z' w/ m1 x
1 u5 B' X7 u$ _, z0 |6 a  F  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
/ J: o( m7 h" L; Z
+ I, a9 ]$ h6 [& MC:\CAB&SIGN\MAKECERT
5 u9 o- w. d& Z0 t-u: MyKey
5 V, R0 [- V6 H/ Y/ {' g% v9 q) p1 C-n: CN = MySoftwareCompany
, D( @  D, P' V* U5 g. Z-k: MYKEY.PVK CERT.CER ( P% N. v$ t0 @1 b. r! Q: Y

9 ~) r& c8 z+ U8 Q# C  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 : J3 h0 T) c  a( l
+ H) l! l8 N  J% F" F9 i+ \
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
  p$ K7 H/ ?) J, {: X- q6 B; U6 @9 L9 ^; h) E7 U
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC 5 g% ?3 h9 a7 e/ P' j4 z3 v
+ I$ E9 V% f: }3 D. k8 H
  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
5 N: {  `& p* G& j5 x7 u6 m4 c7 W
: |% Y' q% ~- f+ g- t0 M  创建一个 CAB文件
  X; Z4 e+ v0 K2 K- S: _* u( E. l2 [9 H
  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
0 L. ]/ u. z5 [) }) Q+ o* B% b2 J& V1 m! {: D/ k& ~
  创建一个 CAB文件: 3 l; `% B# Q! C: U! F
0 u  E2 P$ `9 h( J) w/ t
  创建一个INF文件。
8 B3 }4 X; \) V3 h5 N$ R" j: y7 ]- i  v# h$ U2 N0 N6 R
  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
' L' D+ B4 T1 K; X0 V7 g. N/ C5 b3 ~7 g7 |
C:\CAB&SIGN\CABARC -s 6144
( H: y$ m4 L# [6 Tn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
9 ]) \2 I/ `, v/ {6 \& U/ t! g$ \( d) [' W' e4 \6 E* k; F
  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
3 X+ t- p) v" o2 L  M
4 x* Q6 g! l2 G  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 0 L4 S* M( E& r/ b7 t; G8 F

1 B' A8 V& E8 D* L* q) u+ m  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: " d; T2 e: u6 t
( K, v# Q' R& L9 h
  C:\CAB&SIGN\CABARC + K; [  Q! F- n  L
& h, Z  V; Z0 r" E0 N( R
  创建一个INF文件
+ q% q3 V6 I( [! T8 s6 @& R( b$ E. v1 j. n5 w8 C% N, q
  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目录下的内容。
' y1 ?5 [5 G, G& Y# U+ ^7 |% N# _$ [9 W7 C! _  U0 N% y
  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 8 b" \7 C, n6 j7 |) J: m
3 S4 [$ ^! }5 [$ ?. y$ @
; Sample INF file for POLYGON.DLL& A$ c# \7 O& A3 k* D6 H
[version]
  n9 ~+ Z/ C; o1 ]! E; version signature (same for both NT and Win95) do not remove0 K' S) j- [5 k( c2 Z
signature="$CHICAGO$"
6 ^) @7 t$ a2 y" p! i5 M; q6 E: CAdvancedINF=2.0) i% [* x. Y( Q4 _

3 `0 j" T3 j# a- }[Add.Code]9 j" d! I4 f8 d! m4 k& A- i8 t
polygon.dll=polygon.dll
3 _: n2 j' W" j+ S9 g6 xatl.dll=atl.dll
( x' C- ?+ n$ c
; ^8 A: U+ m" F( M0 L( s0 j1 `) I5 f; needed DLL' i) L2 Q9 z6 T9 G4 E
[atl.dll]# P7 D  G3 J* d' F
file-win32-x86=thiscab8 D& S3 B6 g' q' h2 l
FileVersion=2,00,0,70242 B" f2 B6 {* x5 Q- _/ \
DestDir=11
6 h# e+ p$ A: ?# a2 |( G( l! lRegisterServer=yes
9 F6 Y; R% d- B3 c5 ~1 c+ p# V. R1 \' x( B
[polygon.dll]2 u, g1 _5 c# X6 c0 K+ {9 |
file-win32-x86=thiscab
3 r/ o" s# P  H1 A* w. hclsid={4CBBC676-507F-11D0-B98B-000000000000} 1 D& c9 E# s; K; [% b2 P
FileVersion=1,0,0,1
4 X# O/ v* N4 O! DRegisterServer=yes- P) i. ^/ ^- K4 L- p
; end of INF file
9 l! [: U. l' }- e) D  Q
* a- P# U: O( K  r6 [8 d$ V  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
& T- y8 E2 {8 }3 i+ |) z( p
0 B- F3 ^' F: q0 G8 [+ P1 }  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
0 _5 A1 z. r6 j/ c% _2 e4 Q$ e  y  y
  关键字"file-win32-x86" 指定平台是 x86。
6 X# i2 z+ K; r6 _
' m4 L6 K0 }: j$ J3 s: D" E, ^/ k  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 5 L; Y2 A: ]6 X5 C. R0 d+ b

8 M1 H- L# K3 }  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
0 o3 ^+ D2 j8 V; _$ }1 Y9 {/ k. B: V" j' ?+ _) h
  "clsid" 指的是要安装控件的CLSID。
& J- F( A% k6 K0 P$ W4 y7 B  f& E$ |( h% e. P2 Z
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : 8 ?" m7 V; z$ }  ~9 P! f3 H0 X

$ a& L# m7 T9 i. w9 C* O5 z! ]  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
% P6 \! O  u8 Q) m/ K
+ @* Y/ S; a. [9 W$ ~- F) ^" L  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 8 Q2 {6 f+ m, v4 d" e; I
! L! o( d& h& L. v2 p2 [. ]
  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 - I5 F! @5 W  S+ C# F" d$ i  \; w

& O1 u. P4 x% L! Z& h6 Q6 q, l4 N  签署一个CAB文件- L$ v$ p$ u9 K% N: ?$ [

3 t# }$ M( I; c3 g9 [8 Q  使用Code Signing Wizard签署一个CAB文件:
9 P  `! m* R. D6 W! J1 l* p
5 Q$ m& j# |' q; ]! M  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 " G4 J% N% h% E8 ]
3 ^3 N- }; f$ g" X) V) x1 _3 _+ X, |
    C:\CAB&SIGN\SIGNCODE- o7 C; {3 ~7 H! |5 {0 Q
) [' B, `' a3 K* U8 \! C1 h. c
  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
: o8 K1 z2 j: U3 v! @$ z  X  m: V- l
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
- a! }1 E8 ], j. [" f# |! ^
9 N, h9 y- ?, n7 _+ \; Y  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 0 D2 j+ X+ D  {' T' v8 M* v) e3 w9 o

& S7 x! s% T  n5 |1 Q
: l/ k5 k- v9 F0 D+ i  5. 点击Next,前进到下一页。 ; L; l# y9 K" n: u+ W; {

# h* `# A" l1 _6 }  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 7 h  _( ]! d3 @" K& a& f4 i) O, j
) m- T& ~7 b7 N3 N/ s, d% r0 U0 g
  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
+ {2 Y- u8 y5 l: j9 K8 I% t8 Y* F: |: R/ |! |0 ~2 O
  8. 连续两次点击 Next前进到最后一页。 2 i- K1 |7 A: h: O) F2 U
, s* i8 M+ {; m+ R0 Q  M  [+ W
  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 $ ^5 J* w/ J8 ?5 E( t
% a( [1 k; ?. o( C; e* g) V
  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 8 F& Q: {$ D- ?0 S  f+ _
7 K, E5 N  s( s$ H+ K0 K
  将签署过的 CAB文件嵌入一个Web页
- z  S+ t2 w: T/ ~$ p
- s6 o% g) X  K3 `  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : ! u2 ~2 A4 }, ]" X7 k
: M& X4 ~) T4 a; {1 l- C; @) p
   ID - 控件名称 ( o7 h7 n3 {) m) I
( V. Q( Y' {" y& F6 ?
   CLASSID - 控件的CLSID 1 Y* P0 Z7 O. c- p# N# d  u2 n

8 m) c" I' r6 H; K7 m   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。   T  g: y' q) s* }$ d

% _5 I. X5 c- z, j* O   CODEBASE可以直接指向一个OCX 文件或者DLL文件:
6 @! u6 O3 |6 y; E9 z2 k9 @3 t1 D; E, ]7 O7 _% }( H+ e# ~& f# [
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" 2 }6 T! c) i9 R7 f
/ g7 E8 f8 x& i" Y1 ]2 l
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 9 p6 n: ]) S  w8 C
: G9 x$ J" C( Y$ B' b
  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: ' M1 J& l: z9 G: I' |; d: q

8 D2 [" Q/ j- l/ YCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
7 a2 T5 p# T$ D* A1 I
; E& ^+ n  {3 |/ Z* G* ~  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 13:07 , Processed in 0.021719 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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