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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft/ [  X, Z3 D5 `
9 m( i. g; S4 V2 S9 h
& K' i8 z3 H6 N) x' i
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
: f) c. ?4 `4 g$ w! I
" w8 b5 [+ Q% |* ]! Y  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 / L. D( s$ @6 J: `4 _$ D+ [: y$ p8 O

" V, X( T& T4 R  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 3 V! t. }+ h) d$ i
! ]( s& e2 F7 H( _
  下面是创建签署CAB文件的步骤 : " e* e+ O. u& G  c

& _: j7 a2 Q& q, Q/ q0 i   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
  E5 S) @6 Y6 r4 B* h
% b) K5 j* J* U7 O0 N# ]   2 创建 CAB 文件 7 I3 H6 M8 l$ N% V0 k
% g1 ^3 M! Z5 Q9 g0 h( v
   3 签署您的文件 / \( \' j# Y- s+ v( ^; \* G
$ g* T! T$ W" h# r
   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 ' b  Z$ N" y4 ]  q6 j' b4 h8 }4 [
: T) t5 X: ]+ v1 v( T4 x$ U7 n
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
; [2 w, R5 O) [' T
* i6 |1 W9 B; f1 Z0 r9 |  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. 0 B7 G0 M3 H& x+ l

. h: L4 h: U; h- }. a  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。
$ |( S1 S2 O  a+ K1 A% R7 ~" w1 [: O# O4 H
  获得一个软件出版商证明书, ^$ h; n) U& U9 T5 d8 v0 y
* ~8 i7 d, W" t2 y6 C- o# T1 [
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
; d  ?* n* p0 w) H. X" V$ I% h
- W/ [0 G3 i; R7 D7 {/ l, T" I; d  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: 2 q5 v) J8 L7 R! }# L% f/ Y

% s, ]" [/ K" r" L& Y2 B1 IC:\CAB&SIGN\MAKECERT / U3 M0 s5 y9 X+ x2 M" ~
-u: MyKey * C8 Z' f; D6 B; E
-n: CN = MySoftwareCompany
! l* c) M3 a6 A) B; S- p-k: MYKEY.PVK CERT.CER
& I( u3 E* R  g+ g2 z- b# Y8 c: N/ z% O* K3 t+ ^3 h
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。   ]' ^+ m4 X: y. D5 d% {
) c- ]- C* N! S" h, ]/ s
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
. j$ K# U2 Y/ d8 F+ t4 f' @" ~4 G
8 W1 j2 M' h1 C  {! }% LC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
) B. _% a: h9 k! M" z% k
7 l4 X2 C! ~) ]# L4 i' r& o  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。 * x5 O- L4 a1 q
/ b6 [/ C+ V7 x' P) b# r- w
  创建一个 CAB文件
- h/ V5 L0 l' }6 ]6 |7 Y: D% p0 I0 I& w- ~& d' s
  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。 * I8 I0 V5 @1 ^* `4 E4 F% T$ y) C

8 B" g4 Y% B1 p5 H+ N& U- ^- k; b  创建一个 CAB文件: 7 J, ~* x! Q3 F& X0 r" G

/ {; `" Z8 u# g& x0 ?* F% t  创建一个INF文件。 $ z# |( N7 R3 @
4 N) [1 B  R: N# _, N
  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: # y% m+ w# U* x9 I* L0 y

& p  G3 A' B. j+ h% RC:\CAB&SIGN\CABARC -s 6144
* ^6 p9 L3 b+ \9 U# Un MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF , e. m# e( a7 K
4 ]1 G  w/ v0 E
  CABARC 创建了一个名为MYCTL.CAB的CAB文件。   l1 S0 t' F- Y" a0 M; a. }7 v

8 T' p% c4 U4 |. t1 Z! i  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
, y$ g# g2 ]$ x+ Z
+ y5 D) M! a+ [- K5 I6 M" w  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: : c" |- {/ X/ l1 b! ?

) P/ I& z" S: x) Y3 I  C:\CAB&SIGN\CABARC 2 d; ~6 K" @5 K  K' b. u9 I
: |' D1 O5 @% Y" ]9 k  @
  创建一个INF文件9 _% l+ A, @/ ?% ]: Z# @4 V

7 c" w% s4 Y" T1 n1 R2 J. F$ P  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目录下的内容。
; [: ~* X  Z2 q2 F0 ?  T$ m
. o/ Q: _4 u. a: J6 @' M; n8 E' i  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 + ]' R! ]- S7 z- q2 k
, B# K2 S# B; J
; Sample INF file for POLYGON.DLL
7 F7 p& M6 v3 e0 \8 C$ |[version]
( |' x4 i( ?$ A8 `2 J7 R: J0 p; version signature (same for both NT and Win95) do not remove) D, l& A8 |4 U: U4 o7 I/ t' M; T' T
signature="$CHICAGO$"
; N1 ?8 C* n, H( r' hAdvancedINF=2.0
" i2 ~& E6 ?! {9 c  r  g* a
7 i2 z( [3 q$ R2 M" h1 n[Add.Code]. l; A0 O8 w+ t1 ]& v
polygon.dll=polygon.dll! {- X# K7 g% P4 }  t- P" c* s
atl.dll=atl.dll( P! K( J) y0 c$ f4 I, v  X
, a4 [8 K9 O5 ?5 p* U" w  Y5 @
; needed DLL9 @! n9 o2 x( l* Y) e6 @% P. {
[atl.dll]* X9 Y8 q# e4 n; C$ g( a
file-win32-x86=thiscab8 f- Z- u7 @) u' K9 T4 q2 z, `( S( |
FileVersion=2,00,0,7024
5 h- G7 g8 L! r0 Q4 dDestDir=11
6 }1 k- Z3 r/ y0 n8 vRegisterServer=yes $ c$ J; A- z6 A2 L8 H- c

( ]: \3 W* k5 X3 g( n[polygon.dll]8 X/ c6 V: l! g: X
file-win32-x86=thiscab
$ Q. w0 J) q) [) Y% Jclsid={4CBBC676-507F-11D0-B98B-000000000000}
8 X/ B  g. t$ w# q# |8 fFileVersion=1,0,0,1 ! u8 k; d/ y# u; q4 ?. L
RegisterServer=yes
( @4 {/ p# X) t3 B; V& U; end of INF file
9 E, `. ?3 q7 A" }! S/ T" h$ z) A- U0 R1 @+ \# J" q, J& j
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
8 |% b7 J5 y! \% \) i
' M9 t1 b* M- L$ S  U* y' X  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
) U/ o4 \' }# ~  m' P$ m; r. M& k
  关键字"file-win32-x86" 指定平台是 x86。 8 _# M1 p! Y/ _
5 W- \1 J5 r8 E6 \0 A  ^" d
  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
3 I$ {& ^* T7 V  t" |$ o! D
" z& Y1 W& q% h1 o  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 5 s2 B9 m. M2 M& c6 S0 B

2 N+ x8 l! ~, v" ]8 S' C+ J  "clsid" 指的是要安装控件的CLSID。
4 T+ S# `7 ?8 ]' r: X- v9 Y% _( b6 i6 E; J  w+ Z
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : $ y5 |& i% C5 b& @

/ m( {4 h  j) J0 {& U) G  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF' \! U* Z2 q8 h; a& N2 Q

4 B+ ?# P/ @  a$ O! b4 n3 K* a2 C& T  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
- _% S5 }7 i' V. U$ N
' o; ?4 ~$ n/ E0 ?; _9 J  j  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
/ v2 B" C! e, |& s) h2 G. ^& _' P+ n% T- J/ x: ]- Y4 e; Q3 l
  签署一个CAB文件
% s* f1 z/ B% i: {3 m5 V' C8 r5 o* q. k. g# I  B+ k+ A) {! @% A
  使用Code Signing Wizard签署一个CAB文件:
0 I6 _) _! }4 D9 Y1 {  h- n7 E6 i+ T
  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
1 U' P8 |" g( Y  r( v& o1 x! ~) X" Q9 T# m  S3 s6 w# Q" Q; x
    C:\CAB&SIGN\SIGNCODE
( n/ A" x1 N* P, a; n  C/ m6 k+ [; B! g& H& t/ X& z5 ^
  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 2 S# r8 e: |  ^: @$ C2 i6 A0 D
: Z1 i" a4 r$ M( o1 X
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
" I' a) ?3 _" E/ N0 o' u9 n0 V: r- o0 N! V3 z1 t7 i
  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
5 b+ C5 F: B( ^
1 d& D$ ?; g# V- ~& A
$ e/ R6 b0 P& U' |: G8 R  5. 点击Next,前进到下一页。
. j, P& B0 o' |7 ^+ J' ]' l: W1 Z; H: d- D/ I/ ]7 ~
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
% T3 c5 [; s/ P3 A2 e7 K0 h8 M. Y9 I! L# N  d6 A3 O
  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
9 U3 M2 L, S- q
/ P& m9 r/ C' l- V* j; u  8. 连续两次点击 Next前进到最后一页。 $ [  H5 k& d: o. H9 Y
8 ^0 l6 G% {4 A4 W* r) a
  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 " P; z! ~6 Y8 l8 ~* l

7 c/ W- x) Q1 O# n: i4 r2 e  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
  w/ b! N6 u" O. v
9 E. Z1 P" L  m, R. E( C  将签署过的 CAB文件嵌入一个Web页
( f, ^4 i: `/ `7 n$ N! D8 p) l3 D
- q& T3 ~! }, y  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
, j; T' T5 @  k; D6 f  }6 w$ q4 @& ]# t0 {1 v
   ID - 控件名称 5 m- ~5 H3 w7 M0 l( i5 y4 c

5 s" ]$ S, J$ B5 N2 E0 i   CLASSID - 控件的CLSID
) S! N4 V5 [  }: b8 S6 i
# N! z8 O) A3 U' V$ t   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
7 z# a! [, K$ U, o9 v" g
" C% z  r) v$ u: G6 o( u   CODEBASE可以直接指向一个OCX 文件或者DLL文件: 3 W/ z* E: I! X+ U

" S* d9 X7 _- i* z9 W, vCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" ' s% U% I- Y) Y" r

1 Z4 c: @1 S: a  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。   T6 j0 G, ^; J0 P
  \4 }' i2 I% J& u& i' `) B  p
  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: $ E8 V9 H3 x: C! `- Y3 n8 X3 c

8 P9 C/ i5 U- PCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" ( [6 x$ A5 T+ M  l
4 M+ H1 b- e; j3 T; G
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-15 10:11 , Processed in 0.020668 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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