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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
! [5 |8 [4 }% J/ o; ~+ M9 `, P

8 r) p( {: g+ O; R  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
9 U) M& D  G7 b5 y+ f! s: ]& r, }3 d
  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
( V, D5 ~+ K8 t- ^. l" }  s6 K& ^- H& z! w
  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 0 B, E9 J5 C* r; H' {0 _9 m0 L

! o2 L" H5 F' t9 ]. Y; G( Z  下面是创建签署CAB文件的步骤 : % {3 @+ ]: @8 a, b. U; Z2 @; \! s

5 @/ \1 K3 `/ T" K  y   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
5 A5 G2 u# Y/ Z7 o7 x3 {# I+ i( f. K: M5 z% @6 @) Y
   2 创建 CAB 文件 ) v$ a& R' d. \7 J! q0 A

6 e# N4 N8 A. L5 L1 m# a. Z9 m# P+ m   3 签署您的文件 6 E6 q! `, n- E$ e: n
1 q( X. m0 Y/ \  U
   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 7 ?- ~( h3 \0 p
% O% g' \  Y' R7 S/ j
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 & c3 G. i; V2 Q4 \4 G8 O, J: z

7 \. M$ h! u1 d! c  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. * @, I. S! f& A/ v
% {, E) \- O2 Q8 @# K8 z. e6 o
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 ( L5 a% K* P8 j& u0 l
5 K+ h' w! n6 `; x; {
  获得一个软件出版商证明书$ f6 }/ |' \$ l$ M& H3 h- t( ~
# r# e0 n% a2 Y% e
  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。 , U( a& ^! ]4 e1 [
: q2 ~/ U" Y. h: q2 J
  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: 8 S5 _! d4 k! P5 G; ~4 N

* K7 p) u, @6 ]5 l7 ~9 cC:\CAB&SIGN\MAKECERT
! f  j# j" h9 ^- ~! ?2 M- m-u: MyKey ; g. G7 ^5 z/ Z
-n: CN = MySoftwareCompany ! s  C* e3 M& G0 _5 l7 A2 I# X
-k: MYKEY.PVK CERT.CER : {2 x: u/ Y+ M8 U# v+ {  G
3 \$ C6 G" t( q  l# O$ g9 }& K8 S
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 , M  w: E& B+ s9 Y/ E. s  X

! P8 r3 Q+ d2 i0 s8 I' I  x* C; T+ n  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:
7 I  p$ }$ l* U) ^8 i7 Z
+ ]5 X4 h+ p, V8 lC:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
; Y. \  N, p% }: v1 f% Z4 d
/ U0 ~: u, ]+ h: N5 H  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
- V2 q; G/ w1 h' B9 x6 J* D# {: _; E- z0 x2 {1 @
  创建一个 CAB文件, C4 P4 z5 C! ]2 |9 D3 c8 ]) w

  q( _( F6 u) G( |" Z: H  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
$ W6 C, h' r) D8 r9 B1 i1 d& R4 k/ _- j3 l
  创建一个 CAB文件:
" \0 |  t* V$ A: G# ?6 [) @$ G8 B) g
  创建一个INF文件。
" {$ M; F- d# l) U3 S4 W. G
+ B+ ~4 ~2 d" L1 o  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
% }! [2 d% W; G8 C2 c& u/ y  h/ L; y# {) \( V$ X- P
C:\CAB&SIGN\CABARC -s 6144
5 s( O3 b& N2 N3 s" wn MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
. ?( K& x2 [3 R3 D# V# j4 w! c* s2 T! r- K7 ?4 X- w
  CABARC 创建了一个名为MYCTL.CAB的CAB文件。 9 P& t) h! R, E3 {- g. Y

& G6 V9 p9 M& |* h/ m5 I. e  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
. B" F- |" W8 q: ?* ]4 @
9 C$ }2 {- V7 z0 U; V7 k8 S, Q$ F  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC: % S  V  p6 `% K9 v8 e! C" l. S; ~. l" R' C. x
5 I- q* `+ R+ Z# F5 z
  C:\CAB&SIGN\CABARC ; i1 i4 d8 t$ U

, @3 x9 o6 d, y1 m8 z/ [' z0 A" i  创建一个INF文件
* {0 }  W! [) ]6 U& ^5 z
0 g/ S! I1 D) e2 b/ P# O  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目录下的内容。   z$ ]/ w0 n+ I( E& I' g

; B! |6 l6 C- g$ s* j! f  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 - `5 s0 R' p3 k, p2 ?1 w, g( E

9 h, v) _- _1 F( v  K; Sample INF file for POLYGON.DLL
- J! v' `" a8 H' Q[version] " q1 j0 [, Z! _3 Q; x# V* v
; version signature (same for both NT and Win95) do not remove: F( v+ U- v0 F, S
signature="$CHICAGO$"
9 c6 Y* X6 K/ cAdvancedINF=2.0
& m+ E9 f9 G% n
  u- ?1 y" Y3 d5 u0 o* V[Add.Code]  C3 Z% F% V$ x8 k: e, B! o
polygon.dll=polygon.dll
* }+ Y. w2 X7 P" F. e) Hatl.dll=atl.dll- R  c* U, z; y
4 Z1 x. K5 a4 M
; needed DLL9 f; Q/ _9 s1 {6 O3 A, M( e% Y
[atl.dll]0 H+ I8 g* ~# v3 b" v  K) S
file-win32-x86=thiscab
: Q# P  U  S6 N( y. OFileVersion=2,00,0,7024
% h& g+ Y; g  j2 i- i  IDestDir=11
/ h0 O: l7 e, p0 T+ A# E3 QRegisterServer=yes 2 e/ R0 Q& C& j& ~
- B* W: J' F: m+ s
[polygon.dll]
, U1 z6 l0 R$ R5 P/ O( s  e3 ?% [file-win32-x86=thiscab" V/ i* d; K2 L- D$ g
clsid={4CBBC676-507F-11D0-B98B-000000000000}
( D% d3 |8 U9 f) f+ U5 S5 BFileVersion=1,0,0,1 4 O/ e) ?. A; \- H- v! Z0 N7 R$ f$ p
RegisterServer=yes- g3 z0 `0 y8 O  |  f" j) O% n' v' a, j
; end of INF file : i7 e' m* a/ ^" r  Z# m

9 Y8 F9 D* u) E$ e3 E7 T  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如: 1 u$ \! O# o3 d. I! @
( g8 w% R( v6 G" f. R$ h0 U
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 8 g  C( }" W  g8 j0 A- O2 E% W' z

- ]- e2 N8 g2 u! u  关键字"file-win32-x86" 指定平台是 x86。
3 ~3 V9 V7 h% D: B
# z2 R' W% v/ a6 e: e: a* @. q$ J4 B2 Q  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。   D. O+ h- V/ ~6 R

3 P4 S" x1 @8 S: ]  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。 ) B' ~! ~4 [  T! ]

! W6 }4 T3 G2 r. i4 l: Y1 o  "clsid" 指的是要安装控件的CLSID。
- S% R% i! ^' k, u% S! p. H  u, R2 j8 O+ l! m# t# Q. ~# g) {
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
, T5 e: u. l9 y0 i+ `: N$ U* f# j8 ]
  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
# s9 R) j  e5 }$ |4 v3 x; P2 H1 ^) k; {2 \. m7 m7 W
  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 $ m" G9 b, z! L; j. p$ v4 m! y% C

# b* K5 m( y8 |! R0 `6 `& C  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 & C6 d* J% q2 \4 \

2 W5 Q' ?" \7 P8 u4 T2 e  签署一个CAB文件- u: k3 U2 a0 Q/ b& Y( u: Q8 h. P

5 L& H0 l  u: ~- @  ^  使用Code Signing Wizard签署一个CAB文件: " A, a9 Z+ o3 Q% m! v

. Q( E( Z$ D4 ?1 T5 T- p$ \  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。 # h- O7 G0 p) f1 `% b  m4 K

! D. y- t2 o/ c4 K, V% N, w    C:\CAB&SIGN\SIGNCODE- p3 L7 U6 u0 T1 g4 ~- _

* H* Q& }  t' `) c9 U$ g3 r+ e9 }  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
# _/ g' r* I/ O* b+ q
8 Q* u( x2 U* Q/ M: F: e  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 9 e$ i, L: l9 ?/ U. D

4 F. E' Y/ V, P. _% V* W; Y4 j  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
: C. P' I  P. c* K5 T$ e* H
6 x# b% w- q% {' g) R  a7 R- p5 L" C$ ^. B0 I, @
  5. 点击Next,前进到下一页。
3 e, V& x6 S! `8 d
9 S$ s# O6 T4 _# q+ i) N  r  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。 % \, D* X$ }6 [, c

' O9 W% G" P) t  m  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 / U% s% a$ F# G$ H. h

0 w- F+ V1 d/ B  h+ T) B  8. 连续两次点击 Next前进到最后一页。 8 ]0 r/ E3 s7 T* }2 O" J- X- q2 {

$ C$ o- g" k0 x' X  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
+ N' C: w% N* J$ C
$ O" B4 o" u" _, P) q: d( o  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
% Q; A5 a  J/ T( M* k- c* y. F  Z8 R/ r' p. ~  x! T( |. e
  将签署过的 CAB文件嵌入一个Web页; V/ @* c! i; c, M+ @

! t$ G6 [4 w- l/ N  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : & g# W; N0 a2 k) Z" ?1 Y" T

9 K8 q& [' o, C/ i5 x0 v: S   ID - 控件名称 # p5 ?: c3 a4 r/ d6 m) c

/ k4 k* x4 k7 F  g0 |. {   CLASSID - 控件的CLSID
  N! U) b, |0 H8 t$ J" G. |1 [' Z* h' B* {1 J
   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
, U& t. r/ a' ]* B
5 p- S% r$ t' `% b8 ]1 U, {   CODEBASE可以直接指向一个OCX 文件或者DLL文件: ' K' {4 M& y% N$ E" O* l( w2 W) ~

4 o4 \! O! }- T3 B; r+ BCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
9 P8 E; j8 @4 L: h2 y. y2 I; x* s: }: h& r
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。
6 h; o0 }7 |1 H/ E3 e2 k+ E0 P; }6 B8 b" l* n# L* d
  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1: $ G" ?- i& f1 A( u
% e7 ]$ b2 Q2 M: O5 h: `
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1" # [& V7 o5 v+ n0 R; Z0 ^; P0 f
" ?, \; x' j% f- t. C( {3 E/ l4 T
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 09:16 , Processed in 0.017617 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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