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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
: _) s7 l' E% m
; O' y( d& n$ ]1 z. h3 j" F
( C- F2 Y8 f1 h% p  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 5 j0 \, O* \/ [; N4 u9 g" b

' M0 Q5 e/ D" ~4 ^  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
5 R' I' f" e/ f4 ^
1 _& i+ A3 \' z( ^( O7 X, e  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 3 q% Q1 Q7 d* h* W* l; {+ Z/ k- G
* y- l) x& ?$ H. {
  下面是创建签署CAB文件的步骤 :
, H3 K8 c8 `1 p/ N# c& O& R) w9 S
9 y$ L- y6 J8 r; U, k   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
/ A) A1 U# S/ c$ M0 i2 E5 t5 T! E2 }! M
   2 创建 CAB 文件 0 z$ \% ~: G7 F7 f* l6 K+ C) i

7 R# v, _# S7 G2 p   3 签署您的文件 & l8 F" R8 z2 M7 f
; I" G/ L' v" `
   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 ) O2 @% Q' M3 h/ M( H

- S2 j$ |  W, O) c1 O& Y  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 9 g% F) o( l% C& ^! p
( _; s& g# b5 H6 u% I4 S2 W
  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
) [- L$ o9 z* I& z1 r' K3 g1 `" \: |0 b* ]3 V' U2 c. K
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
/ h: x( X0 o. _4 [9 x9 Y9 O6 c; n  H- m/ x7 p: g
  获得一个软件出版商证明书: d) {2 H) s/ c9 a, D$ k
4 @/ g' o/ `5 B% Z& P
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 9 e$ G# U- q. N& j$ S7 M* L  K6 j
* H5 k; x8 P$ j, G1 L, D  V9 @
  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
  R9 S# }2 D6 V& q+ t/ w$ s6 j; b8 |  j: c* h) K* H7 E. }6 X
C:\CAB&SIGN\MAKECERT : t9 D9 L$ e  D2 }' I+ {+ n
-u: MyKey ; a6 ?6 p0 w9 h8 @- {! U+ T
-n: CN = MySoftwareCompany
7 P: |* Q+ g9 n, r5 j! b2 X0 ]-k: MYKEY.PVK CERT.CER
2 k" X0 B4 n& X9 b
0 T$ B3 w2 O- k6 _' C  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
5 Q: T- i) z  Z6 }5 e$ x1 }" ^7 ^5 }  j  |
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: ! a8 W& v" H) n9 A! A
2 @8 z% `/ X+ n$ c% a  I$ c
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
. [3 i' G6 Q" t- c3 {1 c) Q: `1 ^( e: Q7 {
  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 # v8 _% A9 |2 f1 G5 r

, W' p$ ^8 H: x$ P5 X5 {  创建一个 CAB文件
- ?% T2 @; S- z% ^* }; D" C1 [
- m/ Q# U$ [' a2 }$ A% p+ N  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 ) u4 Z1 [- p: P* c6 d: P' @
7 W$ v& y# Z9 ^6 N% I; G
  创建一个 CAB文件:
+ p3 J# C7 b9 d" z" i8 |7 b
4 w; h1 o) p, b- b  创建一个INF文件。 2 h/ W( g2 q/ v7 M
  t! Q5 S( K; A; O
  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: % {7 F- ~. J5 `6 t

5 x5 W9 C8 M8 L. Z0 e9 SC:\CAB&SIGN\CABARC -s 61446 G* X7 g& n, q( n/ ~# X
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
1 z  H  @$ _( k7 {
8 J5 f0 z& l4 q2 e. x2 K9 A  D& B5 X8 E  CABARC 创建了一个名为MYCTL.CAB的CAB文件。 5 q, X9 _0 I: z6 h. Q( p' a

. U. o2 C3 _# T: o$ `5 A7 L  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
- d% I4 I/ D' E$ E: P+ m4 e
$ l/ A( j2 b5 A9 Z8 G  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
+ I/ B: R$ {& ~2 X# A9 q
% p+ c% G7 N( r; _( Z  C:\CAB&SIGN\CABARC
4 t: M1 E9 _  G$ y# i, z+ x' R' N' v! \, B
  创建一个INF文件; A" w% c; a7 g: j0 r2 ^

! `, Y/ Y' g1 ^- `, E  g* ?  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 m2 G& c. \# O: {

+ }5 }# \- d3 w3 ?  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 6 ]% T$ `9 h) w# n- _/ t- ]

( Y2 |9 _. a$ I1 J1 r' L7 m6 t; Sample INF file for POLYGON.DLL$ h& p9 f, z: H: R4 z+ \
[version]
' S; F" p  P# Q( e; version signature (same for both NT and Win95) do not remove
  g! F, v( B+ C1 y6 i/ h0 Psignature="$CHICAGO$"
9 X5 {9 o) A, Z1 dAdvancedINF=2.09 {5 }) T9 U' @: Z- @- z

8 E! j# U1 R" ^6 ~# I$ {[Add.Code]
% w! j$ ?  P# F3 m( W' hpolygon.dll=polygon.dll
7 I' l4 E3 D1 J! h; _) V8 @, {4 _atl.dll=atl.dll
0 W3 n; H* [4 A; |
4 B) T/ n9 _$ A/ J/ E9 x* s; needed DLL$ p8 }3 U+ U6 W7 Y
[atl.dll]
# i/ F/ H7 E2 C$ I, ]file-win32-x86=thiscab
$ x# F; I* I% b; f  G7 GFileVersion=2,00,0,7024
4 u! B' d; l: X  }, v! M1 fDestDir=11, e) Q1 L0 G0 }0 w
RegisterServer=yes 2 S/ ~5 L& c7 o; q7 c: Q; P' a

' d% G7 i, l) \7 Z) x[polygon.dll]3 o, o7 f9 E3 L1 p) X
file-win32-x86=thiscab8 ]  [2 j/ T, s6 q) p& E
clsid={4CBBC676-507F-11D0-B98B-000000000000}
& S4 m% H% J5 ?: nFileVersion=1,0,0,1 1 \: M" \% x# e5 _% H4 J% _
RegisterServer=yes3 [. J4 C! J# `( ~, t2 E5 C( P
; end of INF file $ Q- a+ Q  W0 }5 e

9 H; z9 \9 D/ w0 |, W  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
7 U: V5 z1 B8 Z4 l- b! ^' E! T* i: j1 h: ?; o2 h7 I' o
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
) y8 R5 ]2 K# H$ D! }7 l5 \8 |
, x0 V! O* l9 K! e  m  l, U4 _: @  关键字"file-win32-x86" 指定平台是 x86。 : m1 N" {8 j: g6 z
* k5 S9 ]5 V. X% d" F
  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 4 ~2 o4 v3 k$ E  {

0 `+ u  ^* _  m3 E* B4 N+ @  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 " a) ?9 m) Z6 f9 S: Q  V9 W

) Y/ R+ @" n4 `  "clsid" 指的是要安装控件的CLSID。 1 q: b/ X. w, f! d

, E6 p  {+ P, t" U  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
4 T  \, q" h4 ?/ h7 |1 N/ g* p7 G  K* r
  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF0 A2 p2 B1 s& y3 {

, L6 W; t. L9 T  q, o  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
+ R2 G8 G: c/ c0 `4 `
7 m( C0 Q& z6 s# l& c$ d/ |  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 2 I8 c4 k( T3 x5 e8 [

" ~7 M  S" S8 J+ X1 O  签署一个CAB文件
. {. e! l; `1 X' K  t# `) T3 m& R  k2 c0 k) A# y
  使用Code Signing Wizard签署一个CAB文件: 6 H, @4 ^) u1 i3 M) E9 v& L  M3 T1 e1 Y
1 C' T  y; ]9 S2 M& [
  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 - V) r' }- T' J

9 a: z# f; @7 ]" U    C:\CAB&SIGN\SIGNCODE+ Y/ i! p- Z! @7 v' L/ E

1 _4 J$ C( a- I! r  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
9 G5 g! }/ X  C% a: d3 \8 E; W
% r: E- b# B  X  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
- d* K# B. N- i4 E0 U+ r( [9 \  N6 I7 e9 Y: J0 t
  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
$ |2 g0 D7 a) u  H0 \% t7 e0 v3 r( u; @0 x6 D/ k' h

/ U7 G7 V; P1 @/ P  5. 点击Next,前进到下一页。 % T/ a" Q+ n8 a' [# O$ L
7 L* P  S' J: a: r* T# c# p+ `0 E
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 0 J% N- H0 ^+ F6 x& Y7 O3 p- M7 p
3 k; |0 y( W- \7 R7 _, [; _- I
  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 4 a; T* ?) _8 f+ ^4 h/ c
" x6 x" }3 T. @+ B4 }% H
  8. 连续两次点击 Next前进到最后一页。
7 e- i8 K" D, D% c
" ?3 I% u. f; u' T  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
. j( O4 f4 e' A, H8 P
( {. W5 r. a! S  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 - p0 Y/ m% ]1 [3 [
7 n7 D* G' m+ W1 E4 J; R
  将签署过的 CAB文件嵌入一个Web页
/ I6 O4 K9 E. Z0 \! ~% E& g& N0 f$ k$ \
7 a2 }8 _/ f- \8 _  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : + H) M  b! r* H% }
: }9 H" c! N4 L; U' B! r
   ID - 控件名称 4 Q- f2 \$ C  i

& D! A' Y) v! H3 f" {   CLASSID - 控件的CLSID
/ |5 {) n) i& z9 y' v: X  g! J$ Y9 v+ }
   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 4 ^+ t9 [3 \2 U0 a3 o3 ~7 `
0 @: q7 ^2 j/ R4 `- V3 T
   CODEBASE可以直接指向一个OCX 文件或者DLL文件: ; K  v. m: l0 ~( q5 I% j2 J
) Q( l6 }  L0 U( z. y8 C# ?
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
$ U1 o! s6 ]& X; c+ m( Q  F* P- i% k0 b6 g7 g' D
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 4 M: I" `3 N, {" I( J- j

7 ?7 {7 A# W# z& C0 \  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: ) d& m2 _  S. P3 {; J6 b3 V9 C6 g
  B9 t# P' q) `1 m0 s! F: q! T
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" % T7 m* P$ _" M, ~+ z2 j

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 14:35 , Processed in 0.018227 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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