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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
& t7 Y' }' U& }1 K, T+ A9 W! N! n" J+ n
% b4 o% ], q4 k( V7 \  L4 p3 C: l
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 9 B5 s2 \+ u" n: ^+ U! T  J$ W3 j

8 ^4 @( c* e# [  ~  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
, P! F$ z; i8 [' V  P- L7 D6 @" m' Y! u1 O
  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。
* E& A. B0 k* J8 G0 _( n8 W& I8 Z, F) j4 x! p0 t
  下面是创建签署CAB文件的步骤 :
: G; A$ V9 z( f' L4 O, U# z$ {3 B- t% f+ \( `- i- d/ ^
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) - N3 m  W$ n% G

8 L, W! l7 y0 D; c" Q! u   2 创建 CAB 文件 2 @$ ~9 q% k2 @7 `

; y* j# e" b. G2 a+ w   3 签署您的文件 5 k/ [+ L- W, ~
% y0 i( H  e  G) ?' b2 _
   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 4 h0 G, j; c7 T3 o1 [
9 E$ d/ U# o# g. `9 w
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
7 {: k3 }9 l& I5 I$ k) T- Z9 o: ?  {, c# j
  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
5 E8 J0 ?# A$ b- o/ J' b! ~! f$ D! y! g; |
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 " v: x6 @/ F% l1 r! V

2 F0 R* z" B: {/ E  获得一个软件出版商证明书
% u6 G9 M+ f' r2 v' [% i; H1 n5 ?$ H8 Y7 D" j) y0 N* L
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 5 |' D0 I6 r( E5 m' J, f: x, u, ]( o

1 k% @" s1 K" R  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: ; a- p! h* }" j; n! |; c" w
: H# k( m) h5 u5 \: H! t1 l
C:\CAB&SIGN\MAKECERT 1 Q% z* I  H9 I8 f6 b
-u: MyKey
, c. R: @4 a: T: y-n: CN = MySoftwareCompany # W8 W3 f  F/ x( O1 z0 T1 M( _
-k: MYKEY.PVK CERT.CER
; F: X! E. W: \  V6 i/ C4 k9 M, K, Z2 V
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 9 t$ {( _5 S, [8 ~( a

$ T( R5 r  E3 {/ `9 w  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: 9 O5 r+ R( `+ g* t$ A% z
) q4 p9 l' M& a' |/ D" H5 s
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
. y" Y8 K6 l' K( ]* U* ?9 z9 ]% ?0 ]8 V* M* w" w- {
  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
8 w: x0 }9 E( S6 k) t# o
- D% }3 u1 y# J# b' y2 d& r  创建一个 CAB文件
! f* u' s2 l* k. `4 e# Q- @, |6 b
; {7 N3 Z$ I) T6 a% L) D- |  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。   E+ _7 G/ J4 O0 Y

( x3 }4 d& U6 x/ H4 b& q  创建一个 CAB文件:
; J, F( e/ L; ^: O! @- S/ P% R; J, j# M
  创建一个INF文件。 ( K$ z$ \" ?' }

# T  q0 z# q6 p6 T8 b0 Z! Y  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: & _- L) e# T4 V2 n. W% E: e9 d8 {* V  S
3 K) r0 W. N$ E# E7 S
C:\CAB&SIGN\CABARC -s 6144; _$ `" Y% e5 S1 W
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF ' o0 a: I: E7 ?' O3 Y8 Q$ \3 A

% N% B5 C( W# X! ~& T  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
& t# L& [( z0 U7 N6 D" S4 N3 @3 q$ O6 g
  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
! G* I# e5 F& z+ m* N3 \; R- I- W; B* P' T1 R- t9 a; l
  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
. O) q7 }) R# c6 G! F8 Z/ r4 L6 m8 z7 v( h, Q% @- g
  C:\CAB&SIGN\CABARC 8 g4 K: f2 W# j9 V9 x& t( u

8 ~. X5 J, _7 b! b- d  创建一个INF文件
7 k% x* ~( c' m8 @5 T
1 W4 F, n4 j6 s# z$ M- {  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目录下的内容。
/ f  o8 S$ Q5 _& `' z( Q6 G' N! l+ S8 D: k7 S
  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 " n1 P9 x& }8 G& t' ?. s2 k  G
- g8 s2 |. `" r+ x8 B; L/ v
; Sample INF file for POLYGON.DLL
4 |6 s+ o+ O1 h* R4 ^& P[version] 2 c8 Z  o/ k1 h- d5 }
; version signature (same for both NT and Win95) do not remove% Y1 B) g0 x; o0 {
signature="$CHICAGO$"' @& Q( s7 Q2 X7 r* \
AdvancedINF=2.0
/ e& r1 [6 B! v& G
$ k; h8 x) s: ~  o9 ^8 j# x[Add.Code]
9 G) S/ |$ x; [8 H0 A0 Zpolygon.dll=polygon.dll, M6 r* j- s( x' b
atl.dll=atl.dll
) A, s% G+ B3 y) O7 @9 N$ E* o9 H+ v2 ]7 t& u
; needed DLL6 x6 S7 X1 @/ q! A) K1 Y' N
[atl.dll]
$ C6 ]" t% H0 E: Ffile-win32-x86=thiscab6 r' L, ~6 p; |$ H
FileVersion=2,00,0,7024
* c1 Q) L7 ?$ N. b3 z& C& w6 Z' o# ~8 v7 iDestDir=119 V' Q/ g5 d+ s$ o: g9 M
RegisterServer=yes ; |0 @/ ^8 c# [$ ?

9 ~- }# e! w, `6 b[polygon.dll]
' A" U. M" s7 \1 U7 m" \; X' Xfile-win32-x86=thiscab
* R! p1 h3 M! Z+ Z3 e1 c: W) Pclsid={4CBBC676-507F-11D0-B98B-000000000000} 4 }; i/ O* Y& A$ z# Y8 p
FileVersion=1,0,0,1
( B7 Z9 {  l! m) |RegisterServer=yes
% b2 p) L5 X8 }: i; |- r1 }; end of INF file
$ ?- G# \6 X# x+ x2 ?3 E  k  x" s8 ^: X! o5 Y
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
$ H8 r; N1 A4 s& I6 ]& w- ^
% f9 l- Y9 P  f$ T# c4 R  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
& L1 i1 s8 d  a0 p' a, E: D
. z" v3 \* |1 w5 Q9 L( z$ u  关键字"file-win32-x86" 指定平台是 x86。 / z; M6 t1 L* |5 T
$ C2 Z7 j: |: x+ K6 d( C! d
  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。
' m; y; I$ d$ L1 i" c) G8 ~5 T, D" X% N: P4 L; Y* Z
  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
; K" M$ T! f, i, T  m. l0 E
  Y/ w+ G! u8 {' J3 k  "clsid" 指的是要安装控件的CLSID。
0 a5 V1 X; N& \  L$ |7 }6 o
7 e: L* D. W: C. `  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
$ F3 h5 o9 A% s5 e7 j0 y, x2 O4 x. }; U0 Q0 _4 z' A
  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
9 l# O& e% \8 {; x7 T' B# k
2 S. R. f6 v+ N  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
/ W# L" A7 P$ I0 C7 X+ i5 p, ]7 F7 m0 d- U
  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
3 e- ^( X& K( M  A# Y) W( [/ A& Z* d; v# `
  签署一个CAB文件
; Q$ S1 F0 \  M' L6 S- s% `1 q" X
  c" ~( @2 T. g: ^& S1 x: J5 J  使用Code Signing Wizard签署一个CAB文件:
: E  t& t* U. E; M; c3 {( R( Z; |3 `* @- s: h
  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
! X0 }: F& j5 e) l' I( j9 G3 V2 @) e% C. }
    C:\CAB&SIGN\SIGNCODE1 ^" ?% }* c1 V; z) G

8 X; G5 T4 f/ d5 Y  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
6 _1 Z1 w/ T5 @+ U  D/ X, U6 e) d
$ b! m9 i; @: E, \; h  e  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 1 K& p  J8 W' U, J) R6 i

, j/ x" j$ i& m  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 ( Y5 R/ P: Z  D; m, x9 ^3 e

8 b" d4 Q: H3 u* T1 M5 ^$ N8 J& |
; U0 p% c% u. J  5. 点击Next,前进到下一页。 & W. |# F2 v* R3 M; q+ r9 T+ A
; _! A7 B& |+ f$ T
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
3 \' {  V& L* t, O: W; @2 v0 V$ Z( `7 }( s2 \
  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
& L+ O  E7 O% B0 e: k) ~; s+ a# h% k+ ?3 e* v  f6 U" \& ~
  8. 连续两次点击 Next前进到最后一页。 6 Z4 k) E2 ^- a& w. q2 b
; r, c4 ]% ]9 ~) X2 ]' S) T
  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
) }+ i# k8 F- c& T2 \, h) k( t0 ~- h' V! Z0 m7 e( b
  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 - l; A7 {# a# E8 G- ^

0 T2 ?+ H5 A: c! t% X- v6 F  E  将签署过的 CAB文件嵌入一个Web页
$ s0 j: w* b; K4 @. K6 l+ v3 S* _  _- p' V% G  ]& U* N
  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : - S% V, [' a, H$ _8 ^; V. B
+ R* L7 @( `! B
   ID - 控件名称
8 X1 s# J) x& ]: }9 u1 S6 k9 T$ A3 A0 n5 B& o* C$ q
   CLASSID - 控件的CLSID
0 F. L' g0 z* S: M% u+ v; N1 v2 ], S% F1 }, r0 Y" `2 ^# L
   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
% E4 |( S( j, a2 k
* f; F! p4 A: c! D2 N; L/ M) M   CODEBASE可以直接指向一个OCX 文件或者DLL文件: * p' H7 ~  p( ?- j

4 i, R5 ~8 j0 TCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1" 9 c5 f8 Q3 t9 v& J
' G% c! f  ?+ d7 O7 k- P% I
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 * d% q: J& i$ B& T# A- i0 t

" ?0 g. t# K/ H( \1 u# h7 S8 N  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
1 j9 ]7 o- L5 Q, m+ B/ E5 J3 t
1 }  l, n. ]* |- ^4 ?0 n! LCODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" 9 }8 `1 k' N+ C$ H; }3 e

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 12:37 , Processed in 0.015201 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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