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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft* w- T8 R- f$ L5 Z' l
" H( j0 d8 X- r" l1 r6 K# s) i
, k$ ^7 @; v7 W5 e$ ?
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 - ^- v8 t, U; ]) I
7 h, B4 l" u4 v6 q  n
  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
7 ~2 h* _1 @$ _( m# y# q( L5 l# s6 x# h, `7 P$ r
  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 ; n' C0 ~! o$ a/ s

+ a; ~! j7 `4 m1 {( E9 C4 l( j  下面是创建签署CAB文件的步骤 :
/ B+ Q, O, c& N/ c% S3 @" A$ y% t4 x3 l1 D) U. n% u( w
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) , L: t# @" G. K3 M' E5 c* ~1 v
3 O  N. [1 F6 I& N
   2 创建 CAB 文件 ! n) k6 \4 v+ n# x! U0 \
' s$ t# b, q6 t* T; V
   3 签署您的文件
# k+ h3 ^0 a, O8 V7 n) N' x9 e3 g# h/ s9 j" x
   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
. `1 x  E4 s0 P" J+ F- Y* Z  K+ f# D9 P0 B
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 $ n) y  L; o* Z7 X3 @
! Y5 M2 M: `# W- A, R8 W3 W
  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. 9 m; y9 o- |. E( v0 `

. V3 {7 u6 |! ^5 G  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
/ ?3 e' C0 A5 D$ a" S: s) B0 |& k4 Z/ e8 Q$ A; A
  获得一个软件出版商证明书
5 }+ U0 t, W% |9 j7 U
$ s- q3 ~/ [# n8 t2 i9 V  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。   T4 w0 R+ _( ?, K$ R

4 ~- @$ E8 y+ Y  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
5 `8 X' {! a9 |9 |' l. V# \$ q% f1 G) T# I( u+ x
C:\CAB&SIGN\MAKECERT 4 P1 F0 s6 D+ Y' [- b; C
-u: MyKey
9 ]$ s2 I) S: `8 ~" S) H8 v-n: CN = MySoftwareCompany / B# \. Y& E5 Y; A+ h# O- v
-k: MYKEY.PVK CERT.CER
$ v+ I: c# u) x% O
, t! M. ]' F5 J" z  l  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 - ?' ]! ?' M) |4 W
3 B& C% K' i# B4 q# _# f* H
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: 6 a4 l- G" Z3 P  o" [, Q* r* S

7 S- ?3 q6 ]' s2 A  S4 \' @- a( TC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC 3 H) r, e: H  s: H0 u2 W/ Q
6 T' W; [9 M# e% \% r- m3 K
  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
7 G9 f+ c  l' V1 C0 G0 t# c* E5 y
+ {7 Q7 H6 b5 F) N( x3 `  M  创建一个 CAB文件
6 E4 }  P7 H' n5 d
$ P% \) s9 g5 B5 p5 D  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 " Z; [' x( [( S8 m  k3 H. o; r6 l* b; w9 f

$ ~( p8 ~  t# ]9 I  创建一个 CAB文件:
* c$ _7 ?5 \  f. `+ r; Z/ u, Y$ R* f1 q8 y  I
  创建一个INF文件。
3 k; A: q0 E1 A% B+ n/ O8 L# _6 |3 X+ T; _( b" t
  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 3 Y0 |  _& J# p: W

# f; J: c0 f+ j4 D( N# lC:\CAB&SIGN\CABARC -s 6144
6 y# E+ b7 h0 ?; z% v5 D/ Ln MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
- m& i0 }1 d+ N# i
7 N' ?0 z8 H  S  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
) I9 A( X) [& Z: U) y) M* n. Z
6 u! p9 @7 U- r. n  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
& c% n+ z3 i; B( w: n7 I* ]) ~- T# [+ F
  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: : f) x* D/ Y1 F8 n" T
2 a" |0 K4 x0 l% z, o7 X
  C:\CAB&SIGN\CABARC 0 i3 ?, V7 I( C( ^+ t
0 u, m& x6 @0 b8 x
  创建一个INF文件
2 T) @& a2 W6 \- c& h, P5 {8 @
' t1 Q+ D) ^9 l2 h  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目录下的内容。 $ r3 Y: h: o( k6 i5 F. U

# r4 E& E2 ^7 `% N  j* y" O: C  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 9 ]& ?" H7 S) m% u" g6 f/ |

6 v! C; i& f6 U# d# }/ K; Sample INF file for POLYGON.DLL( p; S' S( K0 Q
[version]
& Q3 N; X6 y) m1 o+ k; version signature (same for both NT and Win95) do not remove
  \+ e/ E* G6 d) k  Jsignature="$CHICAGO$"7 E6 C5 H: L/ K9 Y( W2 y
AdvancedINF=2.08 w& s' |& Q* I/ Q) [5 ^
% N0 x# ]; y5 N* h9 Z: [6 F" k
[Add.Code]. F* O- ^' N2 L; L
polygon.dll=polygon.dll
2 M9 N4 K& E% t! Latl.dll=atl.dll
! x1 s( }! z& N9 e5 G/ x; T2 a+ l, F3 X  U: {# F2 ?
; needed DLL9 t! ~! {. }5 w5 m2 h7 ^  x8 Z) K
[atl.dll]& f' U- `: G! u% a& O  Z2 t
file-win32-x86=thiscab( ~- k! X/ F; L9 T: Y
FileVersion=2,00,0,7024
! t/ S! P1 L1 f7 a, ~' Y4 i6 s6 TDestDir=11# w" M/ ?2 D& ?1 T+ O4 W
RegisterServer=yes 9 Q# W- S  F# l+ N' a3 m/ t
* b0 E* L) s: u% }! x4 P0 n
[polygon.dll]
& {  T+ g3 P5 B) y/ Rfile-win32-x86=thiscab4 w1 d. o2 ~7 v' Y6 e5 R( M
clsid={4CBBC676-507F-11D0-B98B-000000000000}   I2 [: ~) f3 e3 k* s  Y* {/ z
FileVersion=1,0,0,1
# R% u" S3 G& T- y" b/ k) @: DRegisterServer=yes- m# {3 N7 D9 P, L7 G1 I& s
; end of INF file
* n& k# j- }8 u" D+ j- `" M  }8 C0 \% f# g7 p
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
( V& F9 n; {& r2 I- u1 ]! w( n& q1 l; z9 L
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
( ~$ v) @+ r8 A( J; p; }' m9 N
# I6 S: V* m/ D" t0 x" z  关键字"file-win32-x86" 指定平台是 x86。
7 Z. {+ Z  \$ B2 J1 ?, Y
5 c/ Z6 G& C& T* F: d# P  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
5 N* z. u  d) ], X  O) Y9 l% h; B' H1 o
  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 ' E: _. N! Q, K$ C7 H
5 X: L# F* }( \, o5 M2 s: g
  "clsid" 指的是要安装控件的CLSID。
9 r& W+ i* t1 w; k; I3 g9 c' f6 A  o* z$ d( E
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
( `. C0 n) d* |9 j( ~% y( `9 E" L8 L1 l8 N2 [# J) F* F
  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
9 U* h" S; i* c& B: }. {/ Z7 w( ]/ {# m& V  d8 z6 W  c
  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 $ U; \, q% X, e$ Q: m( v9 ?
* F& F6 d  Z$ g
  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
3 g6 E$ h# P- c) C$ p, |
* |& t+ m, `8 T( A: R/ Q  签署一个CAB文件9 b% @( M$ {- [. |4 H1 o

8 g3 ^( W& B- E. L% f) J3 |  使用Code Signing Wizard签署一个CAB文件:
. C) T6 J2 _1 u. O( K# B
7 V, U- _/ z& _' Q% V  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
% H* I: J6 t% V2 }
& O8 I2 {5 b1 T1 f3 V: Y    C:\CAB&SIGN\SIGNCODE
& i5 e; i$ O3 j7 n
. H0 O7 Z8 }7 u4 g+ m$ P% c  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 6 m" q  |- \6 @8 _

& A+ ?0 `; x9 T  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
- G. U  k; w2 r2 e5 C8 l% x. [6 h; e$ `4 X
  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 / C- ]  b; V' ~  ~
* a( Y9 ]' H: P9 e; C! C; z

( [; C) l, ~8 H- J- ]  5. 点击Next,前进到下一页。 , ^) s2 x0 `& \2 \

5 F$ |* m# k) O  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。   ~2 _1 S6 z% }3 k; j4 e
) q2 g5 K; K# j: c4 D
  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
4 n$ j- A4 [" P# f0 w5 P2 i
: t; U; ?2 w" w* Y  8. 连续两次点击 Next前进到最后一页。
# `% W# b8 M# x# @) y+ W6 X$ g# |* {; |
  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
# _9 z( }7 F7 u4 |! `, I; h9 ?9 I! u8 G' A! g0 t) `
  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
7 _- c: Z+ c8 A( {
# o, G1 L7 U6 U  ~) ^  将签署过的 CAB文件嵌入一个Web页
3 s! X( y2 f# P+ g3 C+ S5 h8 c
  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
, {+ ?3 R# T0 m- f3 u- A. w6 E0 W
6 d9 z& D9 D1 c) S0 H+ ~+ M' W( o7 M   ID - 控件名称 & ~/ s4 f8 J% e- \6 r
" M, v; B( c* i* g9 x5 T( x- ]
   CLASSID - 控件的CLSID
2 @1 ]3 v+ t" |. O) ^
0 i3 E- ], S7 Z! j1 c1 @+ L8 N4 n# r$ `   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
1 T- w* [) e2 {- M+ z5 c8 w, y5 Q% {4 l. M2 f. D9 x9 i1 M0 p% t
   CODEBASE可以直接指向一个OCX 文件或者DLL文件:
. K+ G8 F8 P3 S0 w7 m+ Q: q" [: i4 V0 V4 O' O9 k- @
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
/ m' Z# l, t+ U5 D3 B4 y6 {  i4 S; }' L1 q3 u
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
: e" T! a/ B8 w& e
+ `2 ]3 S8 r$ [9 o# e  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: + I, P+ a2 N! @8 t

0 s4 Y- ^7 f& M3 WCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" # ~4 P* P2 T, q9 V

& }2 V2 A+ E4 Q1 }1 e  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-20 06:15 , Processed in 0.037473 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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