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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
# W) o4 X6 m9 ]2 j+ ^; _: S5 d3 [( E4 F
3 L* U0 A- [. Q4 }
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
; Y  G- ?$ R# t- h, c
9 r# V( ]2 u: m2 X  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 7 J5 X- [8 E3 d1 H' c/ X9 ^) [, ?

( K! r  ]" e/ P6 F  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
# i$ E# ^# X3 h
$ k+ N% a# L# s  下面是创建签署CAB文件的步骤 : ) S) [/ X- ~3 `: N1 U: q
$ y- h4 z! M4 b5 H  e; e9 K# c
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) + W% V. ^- L- n4 @# G6 G0 x1 g

$ s* i4 W  l* \9 r. K, }   2 创建 CAB 文件
( I: o; k) W5 y% k% m+ Q$ t2 z& O. j1 t) ^
   3 签署您的文件
; ~- L" C6 P2 N- H$ R
  Y/ ~8 [5 k4 q. h3 E8 a   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 4 {) F! S. d; O  j  Z' F0 }
  S. L& W! O! D1 k3 Y
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
& L8 ]! a# @/ N0 ~2 T2 u8 n! d9 J- P: C* U" n
  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
4 d3 \  M! t' z& r1 v4 T( ^' x* H
, c  b. v. v6 |# t. w  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
2 n% S+ J8 Z: |7 u, M* U% F, A- |% }+ K% {) ]+ @
  获得一个软件出版商证明书
& X% z) `4 }4 N! `% A0 S! I% x
: Q( h) E4 `  g, q  e7 ?2 p  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
! c% C  G) ?% b8 q" C3 ^- I( _* p" }
  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: ! _( `. B7 L: P; T
% W7 j) A7 G, |# J
C:\CAB&SIGN\MAKECERT   g$ D, \/ x- |
-u: MyKey
) ~4 v& s* J% @( Z; [9 s3 K-n: CN = MySoftwareCompany
, h# t5 \& f" M" ^-k: MYKEY.PVK CERT.CER
- U* D# q* b* S( y( Z' s- v! R, b3 z% [" _6 I
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 * G0 W' |  |6 \" c( X2 }/ t0 h. `

- v1 @! ~$ Z* ^3 V: x- e  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: ( ^" e6 @# \+ i8 N5 S

$ }( ~3 I$ Z9 bC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC 2 N% r4 |" K  T# e5 M* e; _2 O# u

4 D: o5 K  `; p5 Q  }: S  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 & K3 n% {. V" H4 q5 N. I
' P5 t4 U, W# X3 v1 N
  创建一个 CAB文件
. o# g* G) S% t" \1 H* \9 q7 a, [8 V8 P- r
  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
7 n, P% k; V* X* P, C0 w' l! [
  o4 q/ e4 K! u8 \0 K' |  创建一个 CAB文件: - U4 y: n8 w7 N/ B) H  E

  [, P& W& c' ], D/ t5 k! i. e* V  创建一个INF文件。 + J9 i8 @- g, D6 R6 y
' Y* |& B2 I# y/ g1 ^
  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: & ~& @: \7 V6 ?# i

0 j% n9 o; L6 a) E$ H5 }C:\CAB&SIGN\CABARC -s 6144
  k8 i9 Z/ C( v3 `3 b7 nn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF 7 C. [/ \0 |* H7 d: R; I6 L; B

9 m! C2 _0 j, w3 }  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
) I! k4 o- t$ y. S: m+ Q9 I, I
  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
4 F1 G4 e$ B: A# P0 p. m1 q
( S2 g% a4 L. |  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
: A# S6 j7 Q5 @  f- E1 c6 d' w8 W4 Y$ o, F6 X
  C:\CAB&SIGN\CABARC
, l/ j" g& M8 F. n# p- T# O+ y4 n0 y  a, J. z
  创建一个INF文件. s0 r7 a  k6 w  D" X) f* ^9 H% h

& ^, ?1 ^6 C4 p" S  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目录下的内容。 9 G' z' }: N- \3 j! E

! I6 ?/ o- g  B! U5 F  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
# y% ~. r4 o* R* u5 Q$ l7 ~* v, O% H/ k5 v
; Sample INF file for POLYGON.DLL( Q9 W7 ~7 D  j% E' @& T7 ?
[version]
7 a# U( s; ^6 O& M- F; version signature (same for both NT and Win95) do not remove
. b! ]$ F8 j) G( u- a* S  Ysignature="$CHICAGO$", ~& r9 i+ Q' ]% W5 q
AdvancedINF=2.0& T& ?( b7 K$ f4 \
9 t+ f6 |1 ~; [  ?; E
[Add.Code]
. k! X1 \3 l, {' H; r+ {polygon.dll=polygon.dll
9 s  C0 C* r' _" I5 |atl.dll=atl.dll
9 k2 S( a1 w$ i8 B1 w# {4 w4 V' C$ S# A: e+ ], x
; needed DLL; }8 p+ o+ K+ B2 t. i: A! Q1 G; J
[atl.dll]
/ g& n3 q, g5 V; b6 f1 O+ H) e4 Zfile-win32-x86=thiscab
3 E" H* ~' Y' B  ~# ]FileVersion=2,00,0,7024
' K/ N& I; Y8 Z9 @* Z" bDestDir=113 I& m, f, c8 I( S/ o! G
RegisterServer=yes + ]; E9 I9 [7 \8 P, e

; ?# \+ H0 E$ P$ \- g' w+ N[polygon.dll]
3 n! n1 Y- |$ K6 X" z" ~file-win32-x86=thiscab% j0 D6 W$ I2 J: R  x4 T8 |2 I
clsid={4CBBC676-507F-11D0-B98B-000000000000} 2 w! {0 t1 W+ h8 Q" R' q
FileVersion=1,0,0,1 , Q! m: }" D% n4 K4 l
RegisterServer=yes( Z) F; @3 N- X3 |
; end of INF file
- D% X& r& Q- @$ w4 U, K+ L3 ?. P" u
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
, x+ T0 i& I& X$ S) c; a
1 [: d0 H4 ]! U. Y  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
1 `" \; z( @; H+ x, I4 R$ K" U/ d/ H: t5 D* A/ B+ g0 B: h5 l8 C
  关键字"file-win32-x86" 指定平台是 x86。
5 M: H' K( I+ [7 t- T. T
: d9 [$ _1 ~* p+ k- Q% ^& W: c  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
/ k! \7 H8 M' g1 k6 K+ {% [. K7 Y3 ~- K3 l1 R
  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 * O: k' e# k1 g2 R' H% g
5 d: l3 c; Q) y* w7 O4 I
  "clsid" 指的是要安装控件的CLSID。 0 D; c( D& s. G4 m$ F
3 ^/ ]/ A& @& {4 a# c
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
; G7 p! Y+ \, [; Y5 n& B& o, W
& r2 h$ V: y$ ^# _2 p  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
) ~8 H1 C1 b/ R% l3 c: s
8 q4 x# Z# Q) J5 d6 O+ s1 o  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 / ~/ c* u+ c5 u
1 b$ T0 @. M) L% z. O4 I
  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
$ K' ^4 |" Z9 o+ v! x" ^2 `) i. n9 }: z5 d( i+ d' ^
  签署一个CAB文件
+ o, p1 E8 ?5 p( E! l% A0 K; S9 g; d1 j
  使用Code Signing Wizard签署一个CAB文件:
1 w# D6 j4 [7 a+ |2 x) X& @+ A6 f& D6 j# z8 B. M
  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 ( I, k  N! ]' o* P6 [( A& z

% ^# [4 M7 y& R3 v1 t    C:\CAB&SIGN\SIGNCODE
9 [" ?2 K# H+ n" G
+ A3 @! D+ i: T" k5 M  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
' l6 B& o6 j4 C- g% h* y$ j" b, z5 e
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 ! i: F" e( W( Q

' w* |2 M9 d; ?$ H0 u  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 2 f: f% M+ s; k% {
; e% ^" b4 G1 h1 @/ x6 g
- A7 ?5 G/ a7 c2 g
  5. 点击Next,前进到下一页。 3 \) K6 I' B! E6 r( |& x% {( d7 F

- A% ^/ y/ S- M6 f8 j  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 # F6 h# ~7 ?- p7 y' w. l
$ K) B  K. X, Q. t5 ^+ z( l7 R
  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
, A: w# t: q* L3 u
) m( K- v6 z6 D- @: F/ F" a. e  8. 连续两次点击 Next前进到最后一页。
9 q& N) L3 e' ]: u9 r) o3 w
8 e# H) |/ u+ h1 N2 y  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
' W3 o) ~: G- J7 e8 h* T
# L5 q" r5 f+ S4 V$ W  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
# k7 w- X4 S, d9 e- j# T. |# q0 Q7 h! @3 C, y4 a
  将签署过的 CAB文件嵌入一个Web页
8 K. S" S% u/ z- W! r2 {9 r8 }9 |  z8 Z
  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
1 p6 y$ i( \/ K* n7 t. q9 }# n
2 q& x' ^# j& ?( x   ID - 控件名称 9 X( u* j8 o( B$ Y
8 M' @: [1 V0 y4 z1 N1 ^* v' }
   CLASSID - 控件的CLSID
9 K$ h. I2 E( b4 f4 A& ]9 y9 t& N- T) B9 u8 U
   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 ( P6 O& h5 [4 h) o4 ~% K! [; ?3 q

/ w' {# _$ ?: G   CODEBASE可以直接指向一个OCX 文件或者DLL文件: 8 V- J4 [. p4 F: m3 a- v; @- [

$ f3 g# x' _7 X8 Z) @CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" 2 J# P! [1 ^# V) ^: A1 K3 h  x+ d/ ]7 \
, ?4 [) o) q" Z
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
3 P- R9 I, p, f) b+ B2 X  M  L' L* a, K) h( m" @# s
  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
2 Q0 G, K% \5 G# j: U5 p5 |- Y' p/ w( a- D7 l5 K4 a$ i; V/ [
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" ! w! j8 s- M! a+ U* f1 f) k

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 20:05 , Processed in 0.020032 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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