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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
( d" t+ d$ q/ v8 V
# }- [, W& ?- B8 _2 b" p" y) `* k1 L7 F: D- l. W& F. f( X
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 4 @2 p! t1 L; ]' d$ D! P
9 O" c+ F. a0 Q: T& s( k5 A4 f3 F$ I
  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 " ^& k4 j: N& \1 I' U* n9 E  i
( q/ r: G! E1 l6 F* c
  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
9 i$ o5 g3 y- ]+ Q& g6 x6 ?+ Q* _
( I% f* H4 t9 i! f7 U  下面是创建签署CAB文件的步骤 :
% z) f6 A/ l+ _) W# t+ @5 g3 i- b8 N2 d7 l
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
" p' w& p$ i, y0 A2 D* E! s& i6 b
& q: S8 y6 I1 O" A" a7 J" [; @   2 创建 CAB 文件
* ?, p0 ?7 r' p- z* W/ F, Y" G* M" b& x0 \7 z8 d. v$ U) j
   3 签署您的文件 $ f8 a" E+ Y( o5 i

1 d* h  F; o: P" i   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
2 s3 p! A! ^7 X: N# P9 B% a& n& c4 O' y% C
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
& T- ^5 D1 X  K, _& T  B
/ R4 r3 D# g; w% [8 c  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. + b# w! b2 I! I% S
/ r+ q4 K, g1 X  z7 H& }/ ?
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
1 [$ j& @; p; h
/ D9 S2 [  c  a- W0 v  获得一个软件出版商证明书% {, J, b: L& I: }8 W8 Q; H
# C, G5 }7 G1 Z4 i6 ?* J+ o2 H1 X6 H; V
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
* H. ~3 a: r: @: a2 m& t/ v' u* Q
' K, q7 B7 X  f# ~7 @; ^  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: $ J) B9 N) b4 P5 Q
4 E* S4 ~3 c$ K+ H% k6 G+ Z
C:\CAB&SIGN\MAKECERT " S- q2 o! Z0 z2 A0 c, O
-u: MyKey
4 I& N/ Q" U  q6 R& T6 w- Z-n: CN = MySoftwareCompany
) `* |; ?: p% Y. d' e( C9 y) N( X! O-k: MYKEY.PVK CERT.CER
6 O: R2 j  w9 e; w5 K
, _7 Y6 x' s% H' R  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
0 W" d$ W' z$ S% D, z8 \. q1 W% G# v- }' U1 ]! f# |1 T
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: ' D" ~2 d9 t- _/ B7 f

2 }+ p6 ]1 N& [" d; }& R- U) ?$ V' |C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC . Q# \! L0 w/ |

, B5 V. y. Y- J  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 . w; m  o. h# `

5 k+ M3 g! X8 B& s  创建一个 CAB文件
7 n; j1 @" H* T7 p9 T) l" f' v) Y' c" f6 N- _; X( d/ E
  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
$ x) s. T  ?& ~1 P: R, b) i5 ]* ?1 o- M9 j1 D
  创建一个 CAB文件:
0 C$ _0 D2 k% H. |; N3 W7 |$ {' p0 M7 S0 W3 I' _
  创建一个INF文件。 3 e& K! Z5 i- R2 C* s' i
4 r! f$ O2 z9 @' |" w1 j. @" g! Y
  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
. E% M8 j+ Q" y% i) w% \, J
9 X- W$ R% k  M; H1 B4 Q! VC:\CAB&SIGN\CABARC -s 6144
, V2 K4 s8 S& ~" y, y1 h: O8 en MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
' R2 G! D; ~* u3 {5 U
) m# o6 O. `  H4 v  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
' `* V% Y& b" c) n  A
" ]# x7 d0 }# E( v+ C2 F  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。 2 p+ I0 k: L. G8 H) I

3 S% f9 c1 ?0 n% T3 ]: K  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
! g+ N/ r: G  S0 W, c9 A: `+ ?  P9 E
  C:\CAB&SIGN\CABARC
* m6 H  B7 Y8 k& v8 [0 [) S  |7 l3 n# X( ?/ m' F
  创建一个INF文件9 r( F% ^2 O( U: Y# }. c* R0 e

, ^* o/ r& j8 w* W) x( p0 u2 V# R  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目录下的内容。 + N% z8 q+ M6 E4 y2 n) c
  Q0 |1 b# b! V( s3 v
  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
+ ?" T8 ~1 E  {6 O* b  |' @' S9 Q+ T: N( V: v% n1 k: E7 a
; Sample INF file for POLYGON.DLL$ F/ G- X* t6 j* V# v+ H
[version] 3 e3 V4 p- e8 Z1 D0 P$ C3 x
; version signature (same for both NT and Win95) do not remove) U% W! }7 C; z2 y- y% |  A
signature="$CHICAGO$"4 f% V! r: ?% U, h% A8 C: ^$ k
AdvancedINF=2.0
% u; \# d7 ^6 s, j: i2 ]
- u' M2 Y* `! ~: V[Add.Code], q9 ~# R7 k# z; @0 Y
polygon.dll=polygon.dll6 u4 t4 ?+ ]7 V2 y: E
atl.dll=atl.dll
! i) @; j1 v% {* c3 v. n7 G2 A: d4 A; L2 a6 `
; needed DLL
' D3 W; k: j+ ^& a( Z[atl.dll]
6 S  K; |1 \- n+ Y- o2 pfile-win32-x86=thiscab! s5 m; L, q* f5 G( e9 _
FileVersion=2,00,0,7024
& S; f6 o8 ^" ADestDir=11
6 D' h# i( Z6 W  S3 cRegisterServer=yes
/ ~, ~( b2 u4 [7 i. G) p
2 E8 M/ k; W, R, ^7 j[polygon.dll]
( m' ~# L: k3 v* R' Z* t% {. {. Nfile-win32-x86=thiscab
% W( b# q2 p- ?# l7 F' ^* ~clsid={4CBBC676-507F-11D0-B98B-000000000000}
' Q* ?. @' `' s* q% hFileVersion=1,0,0,1 $ y$ j8 F# P' o& Y
RegisterServer=yes# `/ P) j* p2 R& m& E/ m7 X
; end of INF file 0 g" y+ C# |$ z- W2 F

+ g' \" ?, d! _  b% v$ I# S; c5 |  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
: T! V9 N- n. o7 H& o' M3 t4 E7 J/ ~2 c/ A- n3 G
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
0 A/ ?% K# f5 E2 g: ^9 C7 |
; W" |! Y' k) v6 ?9 u  关键字"file-win32-x86" 指定平台是 x86。
8 X8 R  c& ]3 U% [( R# U5 W0 r6 l. }7 ^: S& k3 T! u
  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
* M  S6 H8 J  R9 c6 m% m$ A2 ?5 [( p% S4 Q0 V
  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 . n6 e  W/ d7 G9 {
* h# Z8 M7 e) [- U$ e
  "clsid" 指的是要安装控件的CLSID。
! d0 y3 s8 u; {0 t& \2 A# u3 p& k, }
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
: {. h4 ?5 Y3 C5 o4 W) J! m; v
( K  j. S1 u& i* q8 \  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF9 }! {) f4 u# ^$ V! P

( C* J9 o2 b, s6 G( A# s, h  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 5 x& w  ^5 E! s

/ m* F0 c: q! Y- V6 Z9 I4 E  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 . Q" E3 |1 z& s0 P6 x

5 H+ _3 H4 l, b' M  签署一个CAB文件! [' `+ k' E- Y9 t9 n. D
0 @" P1 ?* V0 H7 q( N% g
  使用Code Signing Wizard签署一个CAB文件:
  V  w0 k6 Q5 \" \8 Z
. e8 T. E. H% W- g4 ^# b2 q7 }& a  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 & j! y9 g" }0 z# [7 V( O1 e
1 L/ d3 e# c; y/ ?& K! h
    C:\CAB&SIGN\SIGNCODE
% I7 R# W- ~% t6 M* o& U$ b* O7 F+ ^2 \, `: Q# F) o/ D, M
  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
' f( w- b6 P5 P: ]7 Q* Y0 _" R- [) d4 S/ G; `. u
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 ; U& S- D' {# n8 g' v
( B0 t( X5 a! o3 Y$ V
  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 4 k& m5 S& H% X( L
( |8 D7 y( V  T1 n" l' f6 n* y0 Y

) g. W$ {9 i1 o; H! O+ H) t  5. 点击Next,前进到下一页。 1 `+ a! d9 W& T) `
. j! }" {% [9 q. K: h; f! Y
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
$ v9 p% @6 E9 c8 v
; ~  f8 S$ ]4 s7 Q  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 % j, Y1 q% e# Q3 R
0 A; J8 {) i' n. p
  8. 连续两次点击 Next前进到最后一页。 6 @# j. H" r7 c  ^! W
; U' g; |7 i! M- ^" q5 D) H
  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
- [' ^9 N+ j* D, x* \0 X) m$ H) X' G. S0 ?) i- c5 f& D$ S
  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 - D( e; C. ~! X% ?$ i9 [0 W* P8 Q+ ?
! `8 L* q$ N/ ~; `. k
  将签署过的 CAB文件嵌入一个Web页+ b4 K/ u. C. t( }
% P; p# O  T1 K( G2 f) D& O! f$ L
  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : 2 i+ i- k: _% K' \) k) A
( k5 M$ F0 o4 q  b  b4 u
   ID - 控件名称 , u: u/ C2 A4 x0 _! K3 f3 \
1 t2 V3 h8 c5 L
   CLASSID - 控件的CLSID
  b5 O$ g3 y8 o8 i/ I+ q
- j' y4 \, l% g, h   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
& ~3 I9 a$ K! c  c% K9 J
+ ~, m7 w# O( \7 J% g   CODEBASE可以直接指向一个OCX 文件或者DLL文件: 7 A6 w! H" Q6 v1 a, E7 H
* p! q4 o# d$ C
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" 1 |( h4 X' |* j. A

, N9 r6 E9 u3 g, ]  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
. Y7 ~3 A) }  p5 Q# _/ [, o5 U( Z- X' N0 x8 E+ w9 a" g) G8 q
  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: 7 r3 N  n3 Q( r& }+ @0 J
! q/ F$ @- a; `5 c5 l; Y/ y% z
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
( b* C( X# \6 Y' E
# F" ]2 k' _+ B+ x5 d# W  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-15 01:41 , Processed in 0.020436 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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