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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
5 K* k7 x) x: w& R, c* Y7 c# Z+ P. s! O4 |, T5 r/ [% }, o
1 C* D. a# e& k- P" ], n& z3 _4 J
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
) i1 O# t) k& @) b% v% D* }! m, l- q$ t& C! ]; T
  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
. s4 n; L+ f7 b5 T
) i0 E6 C  R- h  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
2 d6 l2 h) X+ S5 k6 T, H$ G: Q) U
* T3 M8 }! Q/ O8 w$ L# v9 ]: D" E  下面是创建签署CAB文件的步骤 : % F0 Q: G/ N3 N4 J! j9 @

! w" j+ @$ E; J0 [2 Z   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) 6 k6 t4 ~) O; r) Y

/ e; o# Q) m8 d3 L8 e# T2 m! S   2 创建 CAB 文件
5 K8 [  k+ \2 w1 p' A9 V" P
! p! @- q& E& j- c9 y3 N   3 签署您的文件
( _. s& t5 n# Z( C  h) A5 q; F4 n0 I: f
   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
9 X2 R6 t$ h. o7 f; Q2 w3 W; `8 h0 j. N
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 ' @+ N% m. H; A( Z

: ~# Y0 A& ^% c- A  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
4 }' C% m3 r+ s5 ?% K2 d" w. u8 W5 b" V5 `1 _) Q8 I2 |8 {1 M" ]
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。   D& U* i( z7 k) o
* B$ Y+ K' @$ _# H5 L$ N
  获得一个软件出版商证明书* z1 T) v& S8 L6 n6 Y) ]& f& s

/ O4 |; p: c. n0 K- X  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 & r$ {, n1 o" ?1 P: B7 q

+ b7 i- ], [, j  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
0 a6 o" j6 U+ @: k+ t1 R/ z9 \) n
0 D0 M% N% z, D. T/ S) l3 NC:\CAB&SIGN\MAKECERT * \7 l, p: N7 \1 R- K7 `- b4 a
-u: MyKey
' i" E0 c6 c& i4 q' L: S-n: CN = MySoftwareCompany
' x3 a7 I2 A/ W* g( j9 ]-k: MYKEY.PVK CERT.CER / E! |  |' C. N. u( K2 Z9 L
+ Y9 z/ i8 u! i' p
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。
0 V* D- A; m0 [9 `* [8 S& H/ s. r' ^
  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
; U1 R2 D/ \* D6 }; T* T: \  l, P! a+ e9 d( ~& q$ ^5 m; v
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
' k8 O( z* V5 k9 X1 J  o2 g& _+ b# y9 N) r
  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
' t1 a, X2 A& `5 P) p" S3 W% v5 B! i5 l2 \) O
  创建一个 CAB文件
$ n5 @2 x5 F6 q1 O5 B7 w4 s% o; ?+ U) u9 N0 t# q4 z5 `# `- X
  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
) z' c' b0 @- ?8 I; l+ c
! R6 o- a; q/ p5 g2 C  创建一个 CAB文件:
4 y9 X: @$ f/ i) e1 K! O) u4 K# g5 l9 E* s# b3 F- a% g% D) Z
  创建一个INF文件。 - Z/ d; E8 v; K9 \; s

0 D, C4 J% i/ Q/ _2 ~  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: 5 j. \1 X$ b$ z# ]& Z  E

0 M! k+ \# T9 z) \C:\CAB&SIGN\CABARC -s 6144- e, o# L/ P, o+ y6 h' ]' B' K+ S
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
9 K3 I( r! e; V* X( v5 C
1 L& G! G- N# D  \/ F  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
& |" i+ r- I5 P+ u: [
4 V: Q5 E" o: f; W+ H( Q  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
8 p# u5 I6 S$ b" _7 h+ D! `0 e7 p: x( G
  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: + u+ q3 T( ]% V2 D( I0 b2 d$ H

9 w* C9 t% g5 U- g  C:\CAB&SIGN\CABARC ! Z/ N" R0 N3 o% U' v$ M, z/ M
, K' V$ r7 R, t& T7 a$ w
  创建一个INF文件1 J5 V0 o; V  b. P8 B. }2 }
) g( ^9 W; o5 e% }3 I
  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/ y$ y$ x9 Q, F
% S$ |8 C9 o# |) H% E7 A/ L
  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
9 B, ~" f1 n/ ~7 M: H2 @5 ^5 l& ^; M' d& Q* D, j) r; d- B  P& }
; Sample INF file for POLYGON.DLL$ }1 \0 N2 N  O
[version]
0 d8 M2 k* ^9 }1 ~; version signature (same for both NT and Win95) do not remove5 V/ x4 y% S. \
signature="$CHICAGO$"
0 d6 A5 x2 E5 \* X, l: d- \AdvancedINF=2.0
2 d8 F+ o3 X$ N* L" B8 r8 O0 y# I# a' m6 F# Q* o* B, g0 I% u2 A
[Add.Code]0 ?3 X7 c' Z! Z( o0 v7 H) Q0 Q
polygon.dll=polygon.dll
8 [2 q8 _% a, Uatl.dll=atl.dll' f  E8 a4 B  {

4 ~0 I2 w- X4 ^3 K* }$ v3 Q0 x5 k; needed DLL4 t# j4 Q# W% h0 p# N4 u$ z
[atl.dll]5 }8 k1 M2 \, @0 C* C
file-win32-x86=thiscab
9 o. m/ @' h; Y( f  R( T5 qFileVersion=2,00,0,7024$ `' P# q  i& e( W' i0 O
DestDir=11
+ k: i: R) O3 o! u2 `RegisterServer=yes ( o; d' K' l" v  R( O4 c! s1 |8 X& u
8 ]. T$ U7 f8 h3 O1 }7 P0 I
[polygon.dll]4 w/ T) J/ I& {# l) x! b
file-win32-x86=thiscab
0 H2 P: z0 E$ Nclsid={4CBBC676-507F-11D0-B98B-000000000000} 1 E/ G( z8 H4 A5 E
FileVersion=1,0,0,1 ! j4 h; i9 ?. B2 \
RegisterServer=yes3 T; D  {7 n) O/ O! i; g9 Y
; end of INF file / q! W0 `2 I, |. ?( l$ _
6 l$ S* b! J: i, Z5 h7 T& ~* k; O
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
5 U0 i$ [, ?$ R2 B  t0 G- w8 S7 b( H  _
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
; T& M- P/ `& ~& `9 n( [
8 M. D& N, `. P) W) o  关键字"file-win32-x86" 指定平台是 x86。
8 G' V9 f; G' N& n& `: ^" ?7 G5 x4 ]" l, B2 L4 h. G
  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 & Z! r7 S: ~* H
  t$ t5 u; |' A  L5 y  b& A7 j
  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
+ W/ g$ p/ X) m0 T) G
% w! P- Q- u% |: j: E9 c8 Z! f; m  "clsid" 指的是要安装控件的CLSID。
6 r+ l- L1 i- {; q
7 |  q  Z8 p1 ~. {3 Y$ X& e5 R  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 : ( j4 a: Y+ ~; t* q- b. f& q
$ Y* I& ~, i* W5 O0 B7 t  D% h
  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF( U6 M+ w" t$ }* Q9 [

& `) U$ K" [' L- V0 {$ E  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 * Z* |' Z/ c+ {2 o3 S5 [

6 N& `! D4 m1 F  G" Z. b5 Z  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 0 T+ A8 s! R$ ^. B

+ r& X; K# v- o& W0 C  签署一个CAB文件  ]0 l: `7 o4 p$ u0 @- N4 w

9 L6 O8 b* F# D  使用Code Signing Wizard签署一个CAB文件:
0 |) R6 d! T) R/ u
0 Y+ ~) J2 ]* W2 ^& @- I, d  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
( ~. X+ j* L! m7 u; u
" o1 W- s5 O' a( N0 q    C:\CAB&SIGN\SIGNCODE
! e2 f- I  y. b
7 B5 F- h. }5 I% d# N5 i2 _% Q- g* u  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。 , |7 G! @! g1 c& q9 y/ Q3 b, K/ N
$ R' D" l# @" S- x  F% ]2 J* P
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 9 J, E& _- Z( h) P5 X6 P
  u: D3 O8 V8 @: t" D
  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
0 V8 G* \& H7 U: n" X( C9 j. m0 P# e. u: W. R
' v) p8 q" c8 Z+ z7 V1 O
  5. 点击Next,前进到下一页。 / H8 G; H1 g+ \/ s$ q  Y
+ }+ [2 V5 E/ w. z  y
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 ) L& {0 M4 A% t% x

0 P% |$ o* u( K& o6 F1 \  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
, X. [; c, H# i1 T, z- ]- z( ^9 O  ~+ G6 N  {0 S. b. u, G
  8. 连续两次点击 Next前进到最后一页。 : c5 c1 y' ^# k1 P

4 }& [6 i' h  O- d$ k  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 1 D. U& o. W, v& \

% h5 q( w0 y- H, x; R9 o1 Y$ K  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 1 M# |$ P! V5 c* V0 |8 s: X' r

3 Y! j3 F) `, ~& c1 z* r. h: y6 I  将签署过的 CAB文件嵌入一个Web页
0 H( e1 i7 R: {1 ^
7 n+ u; c& X0 {2 A  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
+ G& J  t2 U$ k
6 k- N2 k, w- }3 L   ID - 控件名称
& }% u$ t8 v0 ?+ K& I" }2 v1 c6 |* G# v' l0 a
   CLASSID - 控件的CLSID
9 |: [/ C7 I, ~' w7 L
& ~1 |6 Y/ i4 A: C- I1 H* n- Y   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 5 k; U6 w+ G$ F( y$ I) R/ K* @

: c- b( K3 A; G   CODEBASE可以直接指向一个OCX 文件或者DLL文件:
4 c: Q+ R2 S9 v( H7 \' v: o6 v% d# L) t7 X  W$ h# m5 m. I$ {$ C
CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" # S: D; z3 `4 ]
. R) E5 F6 _8 ?- X2 Y+ y+ _
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 ! Q! s4 a4 }/ N( I& l# m( r

  V- D' }( R3 ^6 x* w3 m  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: ! w4 {$ K# u* g4 q- s% o, h

+ I  \* W) c, QCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
" d+ U2 V; g$ x  r) c/ o% K- s$ I% o9 O
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-30 11:16 , Processed in 0.037120 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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