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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
% H9 @" _% r! d+ e* j7 T. W+ T% b+ z- C

: x$ O6 u$ ~! Q5 Y2 {+ F' J- n  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
6 H; X( l1 H5 @8 A/ R1 D) R% ]3 f
  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 ( u3 f. ]3 O9 E, u9 Z

( p: z  v6 [# M% @  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
4 ]; k- Q$ A, r2 Y  T4 \+ h& j% `# E: U
  下面是创建签署CAB文件的步骤 :
" X. f; j5 v9 l3 C" |' V; p4 W0 v8 c6 M( q7 d% X
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) + E, o* Y- V- p

& Y! [8 q) }. O' _   2 创建 CAB 文件
( H$ ^0 V- `- {2 m. l3 h- a7 s3 ?9 D2 P* ?$ e& P: E4 |
   3 签署您的文件
% s" x# C8 r3 q  R% i# x( G4 ^' t" u3 g4 J$ x2 f/ u4 r
   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 - E& F2 P/ V7 E9 U* b/ i8 d
' O6 I5 q4 r, g! z: j" w  A
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 * e  ~5 J6 Z7 |7 K5 `

1 E* y) Y8 d7 _+ j  r3 Z: z/ E  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. 1 x$ m. y% C% t  ]7 X6 s! q# s

$ V7 b' M0 r4 U$ [( m" G: k  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
$ C& v9 f. ?; Z8 m0 E  C: m) U$ F! B% _. S! j7 B0 k1 s. E
  获得一个软件出版商证明书$ b1 H2 ]# B5 f
+ P, B3 w+ |; A$ b3 ?7 J
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
+ ?3 ~# c5 e$ b9 f  V5 H, W, T" F/ [- S8 z' r- W2 S
  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: $ D, A: j# S& [3 f8 b8 ?& u# {
; r. g- c: @( S* W9 z) g) s
C:\CAB&SIGN\MAKECERT - x. w" Q) O7 r7 H$ A) D; j
-u: MyKey 3 o! u9 y5 P6 o6 ?8 _
-n: CN = MySoftwareCompany
7 v& i- z5 H) s8 b  j-k: MYKEY.PVK CERT.CER ( Q( O; I* ]/ _# l1 K: D$ I% F8 }3 Y

- ^( q& F4 @9 @+ m8 D- Y$ K  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
7 b& k1 V- k! O: r
8 V( E" Q+ k7 i  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
4 A4 P+ S) z' w' A
+ Z7 v  i/ z& ^  H& q" UC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC $ `1 E/ J1 U9 k/ S: g6 Z" C/ {

* _0 m# X. Z$ `- G: i% i, _  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
2 q( R. k1 v; S2 W
0 v2 e: ~, l% c4 h4 N& q  创建一个 CAB文件& _+ m: }9 L* a/ A
- g5 H! c2 c8 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( p4 Q+ y' \& H' Z! W: z' k) u# U, [7 c% u4 O" u+ _4 D( F
  创建一个 CAB文件:
4 L! b/ x6 P/ g, V8 J  L& W8 s! s* v( U! m7 X) ?4 N1 J! |
  创建一个INF文件。
1 p* t* ~8 M2 \9 D2 k& z7 x
& i" G5 B; n0 D0 g7 R  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 3 ^; E: O7 G/ U6 R8 H" B

5 b- u0 v' R; F" _+ k. R! n- NC:\CAB&SIGN\CABARC -s 6144, B# K: }. S" ~' ^. m
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF ' r$ t8 h6 d/ R6 Q/ a& S
, u1 a& u- l  |* I6 p; S* g' \3 v2 I
  CABARC 创建了一个名为MYCTL.CAB的CAB文件。 + ^0 j2 i5 a% {! D2 N9 d
* x) \9 M2 a6 X+ l3 D) _7 Z
  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
+ a+ u2 H7 C% h0 v/ b! q, z7 J
" z$ q6 B6 ~4 T# E  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: 5 z0 B8 w1 H/ U$ k
* |: q4 M" D* G, s5 c5 U. [
  C:\CAB&SIGN\CABARC ( H$ M* x$ d/ b. M3 z; k1 ?
4 D3 \& v2 w7 q- S' W8 C
  创建一个INF文件
5 U8 W2 X* @" ^) C  R# [$ k! l- P: K$ T/ ~% o6 x
  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目录下的内容。 " g4 p; X: K! ?

2 x; e# `- S3 c5 e3 P  Q5 o, M  P  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 : X2 Q) {  ^5 p, e- J- D

6 r. D% {  u, ^; Sample INF file for POLYGON.DLL% t9 k) M- l! \1 j1 a0 p
[version]
- _6 S2 D  [1 \8 Q# w: G  i% h6 x; version signature (same for both NT and Win95) do not remove
, V1 C1 Y- I0 M. Z) ^8 e6 i9 qsignature="$CHICAGO$"1 N- O# g9 n4 v% V3 @3 h0 Z0 z. O
AdvancedINF=2.0
: U' N; r+ W1 M. L- e: K: c
' ~2 `+ E9 u7 g, d* r[Add.Code]
' u7 _% w2 r+ Z7 V3 _3 xpolygon.dll=polygon.dll
$ ]4 L& M6 h/ Z1 f7 L% _atl.dll=atl.dll2 ^) f7 J; \" k! }7 r- A

' Y, a* P# C3 `3 ]; needed DLL
" g+ k1 g+ |' Q7 X  V[atl.dll]
- g/ ]8 M1 G1 V$ l# A1 Nfile-win32-x86=thiscab7 {  c, @1 p8 p8 Q
FileVersion=2,00,0,7024# D3 Y9 h" V# k) j& N% h* X/ p6 d! m
DestDir=115 w. |3 C# v. d" T
RegisterServer=yes
% Q" s/ y0 r0 P. n0 l0 [0 A! \9 T0 ^% Y+ i4 p  k
[polygon.dll]
5 g5 k2 u, H$ w6 T0 lfile-win32-x86=thiscab
1 W3 ]' S# Q$ Y: G# S3 \2 zclsid={4CBBC676-507F-11D0-B98B-000000000000}
  \! B4 n& z9 h' U9 L+ d4 tFileVersion=1,0,0,1
* I1 Q: ~' X2 y* H+ TRegisterServer=yes
! m, ^! s1 N/ g5 |% v) Y. z; end of INF file
4 e& T0 D0 L4 C- H+ x
* N1 j( j+ |$ G2 x( @( w  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如: 2 x7 i, K9 D% ^/ ]4 S' P

  i$ W( Q( u) x4 t5 P0 n  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 7 P# X* p/ D# U# P) L

& m0 `8 g* s& L2 \9 L( L6 N1 Q5 N5 `  关键字"file-win32-x86" 指定平台是 x86。
, L5 ~! {- v/ k$ O) N) E
9 B6 b% A: b- O% K/ l  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
7 h2 n9 @1 ~; ?& }( _
3 @% t; @: R+ T/ a7 P1 C  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
/ X8 l% g* Q1 Z& W9 l
, I( N2 v  _7 ?. g- g4 E) y  "clsid" 指的是要安装控件的CLSID。 % P: G/ t$ U) I& T. n1 n6 }

! X" R6 D. e0 R& h3 Q- X, o  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
) J+ Q! N. m4 V! I9 {- `, @
* \' p# r* e" e' l' p$ m" {, J  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
- h% O3 K6 ~* r5 i% u) x7 ?' c
! Z  Q; g& N6 N# g  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 + S/ U2 L- b- _- L, l
) I$ d& I$ a+ p$ \7 Y  D- L6 Z% ~
  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 # q8 m* b5 f$ z

  z0 @( y  O  a! s  签署一个CAB文件2 I0 _) R' o' X- H5 N* v

( x2 @; ]/ @) f8 @/ Q, x  P  使用Code Signing Wizard签署一个CAB文件:
! Q' n' V. d* A1 v
% a) M  c1 i. w' c  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 ' S, t+ o' p: I
* f9 e( Y" b( B9 d) `3 i
    C:\CAB&SIGN\SIGNCODE! H' c) s# S; B1 d

5 |- l* G7 K8 i1 O/ S  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
8 Y7 H9 }9 q1 X5 d  e# u) y* C' Y" e. }4 b8 C/ k  [/ M( [
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
- @" P3 R* m5 G, t! D1 I) Z+ L; L9 m- B4 l* L; V5 B5 M; N
  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
3 f( u- n3 }; |( X4 u" M! @; k3 }/ i$ V1 _' l7 h2 ?* M
  t) h3 [0 |/ K) j+ Z2 B- j$ g
  5. 点击Next,前进到下一页。 6 u# j1 {6 O( \' u0 S
) _0 W5 T% o, X) Z4 t# j* M. i
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
* k7 ?) M3 B2 S! u
+ V; L% z  j1 L8 q( F- |; v  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 # i0 `8 e& [2 m- l, u  ?
0 t7 E3 {8 Y) a/ U- g
  8. 连续两次点击 Next前进到最后一页。 ( l1 ]! k( H) @6 w
0 ]* A' _  O4 g4 Q* c% W' c
  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 7 @1 U" [/ E. [5 F; W8 }1 U

0 P+ q6 J: w  D) V  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 - S! @9 ]3 Y& A7 f7 B
" v5 @- ^! [! D) n# f7 z- m2 e; x
  将签署过的 CAB文件嵌入一个Web页
; {3 w+ `2 D- {! I, G( r3 F. G0 e9 f: j* O5 k
  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : " |8 e! X. [# _" ^
6 ~: O8 Z5 o# h5 m4 `) L; y3 ?* [
   ID - 控件名称
3 F! A, _0 A3 n8 V
2 I3 F  \& F8 H6 Y/ g6 p- v   CLASSID - 控件的CLSID
7 Q6 z1 U- l) b" B* q+ Q( f- E3 F) z& ~
   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 # _9 n7 v+ d7 A5 Y

7 w. B3 S: R- N) y   CODEBASE可以直接指向一个OCX 文件或者DLL文件: 6 E) y/ m- {5 ]) h/ @2 M4 |

  y+ ~) n+ V' i( _CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" 1 ^5 s* C# K) z! R  L

( Z! o+ g0 I, L, |  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 % `; P4 Z3 @" \  {

3 s" ~1 V. S5 t# s! ~/ s  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: $ T! _; [! t) h  @5 x7 v" T3 q

- c3 {' {. P& |$ LCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" : U* B% O) C" T  i9 F; {3 ]3 L7 P; F
8 w/ _1 E0 w  g
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-9 10:27 , Processed in 0.034704 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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