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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
% T# A7 J3 x2 C% O0 U' ^+ [6 X5 N( `+ F( H
$ J! b) j" z& ?& w" d; m2 p+ d
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 % u" Z* S& e: m6 {6 L, n# ~

" k+ q# X* h& [1 Y8 q  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
" I, r8 S9 T5 k( Y" O5 L
) g5 T, w+ |7 P3 U9 U  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
) U+ F" o: L0 E# E0 \- ~- X  [2 ]: P" l9 _" l* s: {$ h
  下面是创建签署CAB文件的步骤 :
1 E9 p+ {- R7 ?5 A) F) B- D
# b+ J, }' v$ l+ _. I   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) 3 V* Q+ m1 V$ `1 k

" E8 G- D/ a. w) f   2 创建 CAB 文件 7 `$ J8 g2 {( r8 j3 T* g' s

  P/ f+ |* ]- a- a4 e1 v   3 签署您的文件
8 G8 X: N8 n' m& E9 C/ _
6 f, Q$ u4 G  t! P   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 ; J- V/ }# l$ R+ b* Y, Y" z
& g; e( Q) c" C; }
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
% o5 W" _2 |8 v- K; ?- O  Y, c
- w6 Q5 o7 ~) ^  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. 0 l' [* H+ _# d
/ m& q& ~, D7 O6 n, ]/ [! d
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 9 m" u) A" U6 Q+ u+ z( e& |
- c8 [3 f: P0 l3 u% `7 Z! b
  获得一个软件出版商证明书, m( X+ @6 p; o& W: m% B2 L
* K/ Y+ {- T9 s, ^' W4 s, K
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
- A" {7 A9 p0 C
) V: R! P9 Q! ~6 P# p8 c7 R  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
" R, j5 H" t' s. I: P3 c( l. _! g: v6 d9 L' }8 G
C:\CAB&SIGN\MAKECERT - i' f" w0 N6 k" b! B3 o9 ~
-u: MyKey ( `7 r0 }* F* q( {( T" v; [( k
-n: CN = MySoftwareCompany - T' u) R# ~) G6 i6 a! M
-k: MYKEY.PVK CERT.CER * e0 r4 w; U# w) N# O& c' ~  Q

; ~6 o5 |% @) d$ f# X  M, s  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
1 S- F) j* J& M) j& O( F
4 S8 n+ @* B$ B# s  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
# z2 ?" |* T2 a+ Y, I
$ v7 \' g* z: o! wC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
2 Y1 O/ N; i& m! s+ s8 Y" |, b- Q9 `+ ^. T
  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 ' C5 J. R2 j. k0 l2 n4 c

; l# A6 n3 ~) Q2 W, e. Z% E' r! q  创建一个 CAB文件
4 t$ F+ J5 @3 |" B5 _& P4 F) N0 N4 F5 q1 `+ V$ E4 U5 d
  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 9 v, T$ I  c: K) L) u
6 y1 J3 D6 t4 D1 t- P: y
  创建一个 CAB文件:
2 b+ T6 ]: G( o/ ]0 l3 G( ]" }1 W1 M* t
  创建一个INF文件。
+ `5 ~8 T. x; y/ C4 B
5 ], W* D& b7 M- _" M) Q  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 6 d. a# J; P- ~' N8 V

( z, R" p2 P0 \  U. U7 @5 vC:\CAB&SIGN\CABARC -s 6144
% K. [0 ~- r- V; n6 u; ^3 @( mn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
; {4 t% W' F7 o3 ~  l4 U6 s9 F- J- `: H$ j9 p" M% U
  CABARC 创建了一个名为MYCTL.CAB的CAB文件。 4 _; K! W" |5 a" K: d! l0 X6 Y
, J  a+ [" Y$ j
  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 3 j, y' _- d/ f0 H+ k5 W' P

/ v; W; a' f- b$ f( B5 {  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
7 _' J! {0 {0 b1 Z/ k& f8 K0 _, f# Y" E5 v8 v
  C:\CAB&SIGN\CABARC - H5 T% S2 v! u6 G
( S- O) s7 N( z8 Q- P0 _- N" g
  创建一个INF文件# `/ I. O" N9 X/ u/ l$ D

6 ?# p# `' O/ v" l7 w# \5 C% [" ]: T  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目录下的内容。
, ]& `+ [4 k& ?0 F4 Z0 m) j) K# x3 [' C# H' G1 }( K# X; G* \) z" e2 [
  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 . J/ m$ u- C. @$ s5 I8 ~3 p/ X

9 Z  q3 j6 k2 Z5 t& h; Sample INF file for POLYGON.DLL  ?" n# A# q- S: l. ~- f* ^
[version] 9 w' h: i9 y. m6 i( W( \9 F
; version signature (same for both NT and Win95) do not remove$ S+ V, t8 p+ R( B
signature="$CHICAGO$". h, A, e0 n0 E
AdvancedINF=2.0
) r* V! C. L7 h' J- j5 S1 _* ~/ y4 V1 W! o
[Add.Code]5 g! ^. {' j4 F1 C( K4 o* d
polygon.dll=polygon.dll( w- G8 J5 h2 X0 \6 N3 {" p
atl.dll=atl.dll8 K1 G+ U% i) M5 M
0 W; a# O0 T# v& f. R. L
; needed DLL
  U: B& d0 ?8 }, k" E[atl.dll]
- K) q8 @. V8 zfile-win32-x86=thiscab
) {( \1 M4 e7 @' lFileVersion=2,00,0,7024) C% y# |! Z1 D4 ]
DestDir=11; t  f6 a, b4 z  \: q
RegisterServer=yes : p* P' X( A: Q' O3 ?

' ~$ I  m, M# R9 M[polygon.dll]7 Z; S( Z+ i% [5 ]1 A
file-win32-x86=thiscab
# p# a9 m- `8 J. Z! k, J( Cclsid={4CBBC676-507F-11D0-B98B-000000000000} 4 z7 W3 S/ |& u  Y; ]7 C  o% r
FileVersion=1,0,0,1
" i# b& p5 y2 B  u5 o  IRegisterServer=yes3 \8 z2 P6 C3 I2 l$ H% Q
; end of INF file : T2 c5 c1 x* Z/ t8 j

8 G1 a3 Q7 |# m1 ?0 N4 O8 V5 z  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
* O, i4 d/ B4 _. H' l( H) G% K" Q- V) y! m, E( ~
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL . x5 m  t1 F' p! L: f7 @6 E5 F
: C" c( _' b( l
  关键字"file-win32-x86" 指定平台是 x86。
/ P( ~2 m9 }0 J# L  N+ x6 Y1 y7 c! }; D' t4 k) ]' q
  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 " N: S) X: d3 y  s4 H% F$ x

4 V) Y# h# L/ b3 _1 z  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
# i- [, G, k4 M9 t' F
" e  T5 o: @9 A1 k, ^: j9 J0 ?  "clsid" 指的是要安装控件的CLSID。
* b% D! i6 q( x+ O+ i) U
1 O6 d( J* b$ i1 I5 s8 g  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
! ]- e6 X, t( u1 u+ l
" \9 A' Y, d) M% y  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF4 z& P  U0 M) o
: _/ i* ~8 u! ]2 l1 R, E
  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 ) U& J. P) C- B3 a9 _4 j$ r$ U
. m( G1 ~, y- O  j
  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
; R, g4 X8 C4 s3 x5 g
# Z8 Q- h, |% K- n" Y, l! x. _% f  签署一个CAB文件
) a( T  C# U( B5 b2 B* T! X9 t5 c0 Q- j0 m3 @
  使用Code Signing Wizard签署一个CAB文件:
. C  h( i6 k% m, d5 }; a. I: |6 ^/ p
( }5 ~- v* t5 N7 W* A8 W( m  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
# V1 S( L( k; G! B0 A& Z" o1 ^7 n7 n8 Y- s9 T8 I( U
    C:\CAB&SIGN\SIGNCODE
) E8 K( d! A7 B& s8 Q# p. e3 k1 a
9 v/ w$ e( G3 T& q; z" a  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
3 q9 v# C+ S5 K3 V  K! ~
( z6 j  I) q3 Y6 O  x: u+ ^& h  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 9 V/ _3 ]- t( `7 J6 n! k

0 h2 A& p$ e- T5 S* @  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 % _- F1 l5 h6 q3 M

  J3 Z; P. e+ x$ Q& U# C: ~5 @& ?) u# t
  5. 点击Next,前进到下一页。 ( j. i! V0 h1 h$ P  E# b% L# E9 v! Q

  l: g( ^5 `, }) ]6 k* w  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 + G/ Q' n5 s7 F

/ u( `* r8 v8 ], K; E+ r" g% r( d  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 # V7 u& `- O# B$ w

1 C6 u; f, N2 n0 \8 a  y/ Q  8. 连续两次点击 Next前进到最后一页。
  V2 V$ A& Z; J* S" V) O) H: h. P/ C: q2 r6 H+ T
  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
2 a: O+ O) T$ Y
* {. U1 g+ Y1 a4 |, {7 p  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
! W! ^% s7 f2 Y- Q& H: `/ L# I. X& V$ T; ]- w
  将签署过的 CAB文件嵌入一个Web页
! f8 K+ u  |* {4 S# I5 ?3 Z7 c% n8 d; M( R; k
  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
% r; F; b' O5 A2 R) A+ a5 O% T7 c; q. ^5 r+ m
   ID - 控件名称
7 x7 L% {# c7 P+ y7 j8 u9 _) h; x- Q0 n2 L4 X+ J* H  T
   CLASSID - 控件的CLSID
' L+ C0 d  b* ~* V+ ~
' c, V  q- h/ w0 W& `* k0 r   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 7 G# X% W0 b, {' r

0 W3 y% V' \0 R5 A: x. X8 w   CODEBASE可以直接指向一个OCX 文件或者DLL文件:
0 o& _% `1 A" S7 a9 N5 {5 G7 t' v4 F; |/ Z4 P6 h
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" 1 x4 V! o) S- M
8 v& z6 W! S2 w- \  C- j
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 ) t/ K) x, f( j6 ^) ?1 }' C, F1 O# b

6 f  Q& o  b5 G. o9 Z9 t5 x  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: . w; K" G% {% j9 F" r4 l

0 _3 f$ C5 g1 \# t. z* g6 RCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" ! ?- U5 m6 W, X
& a1 c" M/ M. k! `, Q# U" r
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-9 06:22 , Processed in 0.034398 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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