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

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

[复制链接]
发表于 2003-10-19 12:00:46 | 显示全部楼层 |阅读模式
2001-12-20  microsoft
$ n, Z, V) l$ }% X7 q$ a' |5 O) z! S8 k0 h/ t$ A! N2 ?( n
& N  N! M- `8 ~  q7 Y
  如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。
, g6 \# v) i, \
( P  C2 j! P6 J- B" S5 [5 Q2 w4 v  创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。 9 A4 _' j) @. W: C! o* ~0 q1 g2 y, m

$ O5 z  {( o1 R' x, ~, n  在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 7 I+ h8 \8 E: u. V% w6 c

1 T) Y; w3 w$ W* V  M* b+ C$ v5 x  下面是创建签署CAB文件的步骤 : + z: S1 h: l0 H! k, J3 ~
& x$ V7 y; i. P. y  E
   1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用) % |& k0 V2 O* L' k% L4 T' ?% m
# |: K! E$ r8 n
   2 创建 CAB 文件
9 e; Y: z% E( I1 \# Y0 ~8 ~0 Y4 m6 R6 l0 H5 g) F
   3 签署您的文件
7 O& h, O) M9 z% ~$ E8 V5 |+ |
7 N: g; d( Q4 f# \1 n8 |+ N) g   4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书 . m) \* L% [  X  k
5 _( q, C1 z! O- C# r
  在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。 2 K7 O3 R; M9 D* e3 s1 r9 n

/ X( |! F% j1 C# z6 {  有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.
- b% p4 e3 a- u# C) {, [3 s* \9 L/ G6 K
  证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 3 I& R: |" m! h( R+ |# z0 N; [
( `4 S. ]& Q1 u7 I* }& t' ~
  获得一个软件出版商证明书7 c8 q4 L( c0 O% W, z

% |- L( b6 j! y2 K% j  您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
0 f# S$ n# E& A2 t5 S0 ?. O3 C* v
8 |( H# ^: A9 O) h1 w  x" A  比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:
. G  ^$ ^  e: l- A: Z4 X: ~7 P2 R! |3 S% K, S/ W$ P8 K
C:\CAB&SIGN\MAKECERT
! b5 z# s+ Q" \0 r6 n' c* d9 C-u: MyKey / I9 m# {+ j6 ^$ m/ U. J
-n: CN = MySoftwareCompany
1 O! S- D# Y* t-k: MYKEY.PVK CERT.CER 9 a: h/ D+ R$ s8 @6 y) V
8 F5 O! }6 y0 {5 U
  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 , g4 S$ ~  R& }' |6 _3 j) }

! C0 V; N: L% c- l7 }/ f6 n2 h  做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: 5 k! s. V, B+ T, g7 f5 W/ ~1 A* U
# E- `+ K8 S% B  F
C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
; O$ J" w1 a/ L8 J3 X6 P" l8 K
" i+ W* j/ Z2 k6 n1 I5 {8 b  注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
4 L/ }9 \3 X. o
8 g1 M0 H( Y6 ]; R! y9 w2 j1 m1 _  创建一个 CAB文件) |, u; K4 n( F: \* i- g. ?- E

& R: [* u5 d/ b8 z" E  这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
  i7 [7 ~6 }, g9 ]6 L, U7 n
! C/ \0 Y$ M3 S, }$ m1 o3 F  创建一个 CAB文件:
/ g/ s3 E+ W; q- M7 j; ^% D* V6 b- x/ [1 n6 s/ X
  创建一个INF文件。
0 U1 a: }, Y0 [+ D3 t. `7 y- ^# w6 R( S' q
  运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如: $ X3 g) H  y- U
& j0 C/ C; B  y: t
C:\CAB&SIGN\CABARC -s 61444 c5 [% N: o) v
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
! l2 H+ R4 i$ v: ^0 F0 m! y5 g* [. Y
/ N' J7 G0 Z+ R: m  CABARC 创建了一个名为MYCTL.CAB的CAB文件。
7 u" a; t/ `* v4 N! L' e0 U3 X  o8 ^) U; M0 s$ o: V
  您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
" E! ^: k# p  l9 [8 T$ n4 Z7 w1 g, h; O+ z
  -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
3 O9 d' m# y+ u* Z+ F. z6 K4 u+ o  A7 }* }3 E& o5 R
  C:\CAB&SIGN\CABARC 2 b3 s7 T; {. k5 r2 A! b
' y( j1 _) D+ ]+ h* [4 l8 m
  创建一个INF文件
6 w# `3 M  L- a( Y$ |% a
; u2 K, U; n* `- u0 t  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目录下的内容。
5 s7 T4 F0 U5 m& n& ]( ]
, ~4 y# K+ M# t$ L" d, L  作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。
( K. [1 E$ ~& B' ]7 ?/ ]3 U2 [& C, S( ]/ o8 p( z/ B
; Sample INF file for POLYGON.DLL
1 X4 V" e9 b3 E/ L0 V5 Z[version] : C0 X5 C1 N& P8 \" {5 q
; version signature (same for both NT and Win95) do not remove* p! H1 s6 e4 L3 {: r
signature="$CHICAGO$"
/ c' w) Z* v5 b) E% dAdvancedINF=2.0  H# e) ]! ]% n) z, w3 \

, r$ t6 Y" N+ C5 \- A[Add.Code]4 `; \$ ^8 W1 }+ V+ D! ^1 J' q+ L
polygon.dll=polygon.dll1 h/ |2 ?* x! r0 c# E$ e
atl.dll=atl.dll1 w# L. x0 G& Y' R: G/ S

$ x& d/ t7 X  I2 t" ^; needed DLL- V! d5 F3 ^) F, X
[atl.dll]
0 Z+ X, D  K; ~6 T/ Mfile-win32-x86=thiscab  Y- N4 z6 }% W% v+ ?- _( n3 \  ?
FileVersion=2,00,0,7024) B% _) Y/ w3 y- B  a' |: @& ]
DestDir=11. F* I, E1 a1 \
RegisterServer=yes   X# z& y! g! y
4 ]- k# z9 i* ~: q# s' M1 [- j9 o
[polygon.dll]
" Z! `4 w, T( C# ufile-win32-x86=thiscab& ^! x/ _& H/ V6 `
clsid={4CBBC676-507F-11D0-B98B-000000000000}
4 x. J5 e9 y5 y0 ?) Q) OFileVersion=1,0,0,1 + z" J0 q" I0 e3 A5 H
RegisterServer=yes- o% e. Y+ h& @/ b8 {; D# p# w
; end of INF file & U: h2 {: u8 G' z0 n- Q
7 u& K! k+ r- W0 ]" ?) J# v) g
  该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
! G9 Q2 z, I5 T5 y' Q; T6 ]; P/ M* N+ O2 [/ i+ r6 o% \8 o. x
  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL 7 t/ Q; k: l! D+ x' o0 D

, g$ U0 c' q0 A  关键字"file-win32-x86" 指定平台是 x86。
, b' k: N( }! k. \
( V; b$ I; k; M6 T& b  E  得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 + Z( d7 G9 L; d& N
+ E9 D" w# t  M8 ~7 i
  "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
0 {4 F, B2 ^9 h6 r! J8 F% }. N/ O
$ A, W0 m6 p3 }, V7 P# D3 r# k* K) d  "clsid" 指的是要安装控件的CLSID。 0 \. Y* c" d# a4 u' L1 t8 _
* V3 p5 R5 O9 l& ~- u, @8 E7 k, W. A: e. H
  创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
+ l2 P% `7 w9 ~) }3 \$ w7 N3 y0 @* v: ^& T3 ]# G% J$ T& p0 U/ c
  C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF' k9 r' ?7 i( F5 y* {! b, E
; p( r( ^! `+ u2 z+ _0 y
  该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。
: W+ I0 W- B/ d7 |: p& ~+ g$ b! h( z: ?! s. ?6 f2 d
  有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。
# O+ D1 a0 B% i" r7 p, ]5 a
5 N2 f# F) a! f; i5 z  l) ]  签署一个CAB文件
, |$ y4 I/ E% b. H0 P" g. P6 Y8 a9 {, E3 x% {2 C4 s! ^
  使用Code Signing Wizard签署一个CAB文件: + L2 Z# O! H8 u! r: W; D

! W, [- ]& K8 u/ @  1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
# m8 ]4 o8 U  F) W% Y, m6 {/ B& t3 l# e* I4 m6 t8 T' C: L* ~+ j
    C:\CAB&SIGN\SIGNCODE
" F, U3 z  [+ {2 E! q& C3 V1 K) G3 o) q9 F# t- l
  2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
8 w! F( B9 U% h6 O0 Q% V( @( t. K; T. Y: F
  3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 % Y. T7 @8 ?2 F1 ~9 s& l4 k5 F
! }6 b1 _7 l/ Q# j+ K
  4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
! T; I$ k7 F& `3 A5 I- P
1 j! ]) F2 _( ^" }$ C. p6 Y+ N0 P  Q$ Z  D& {# ?1 r1 {1 L
  5. 点击Next,前进到下一页。
4 E6 r: c2 D/ b5 F& D* j& s2 C: y2 j; B& \
  6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
6 r/ b+ {# f* X+ S* P) a
4 ?$ T; Q* S3 a6 h0 f, {  7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 . U0 G7 H  |. L' O1 E  z
2 p$ q. i/ G+ q
  8. 连续两次点击 Next前进到最后一页。
' h/ t! {4 ?( J% R1 i" \
: X) X+ Y) f+ D  g# d  9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
- Y3 q/ A4 K) c4 K, O: w
7 l* C' V" m8 m0 n2 D  L, F+ l  您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。 8 _- ?' W$ t9 R$ @& s2 }; \( i, j
2 X6 T6 f- q$ r$ E( X& z# V6 e
  将签署过的 CAB文件嵌入一个Web页
# {# z, Q7 H( O( p. n
; p' I9 v3 ]" |0 Q7 ~. |# K  ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : ; n. L4 G" W* j1 X' L
# |1 C- m& C- g2 t
   ID - 控件名称 8 R) R: p; x/ Y( J) ?* |
. T* m2 `3 c! L' K' |: M
   CLASSID - 控件的CLSID 0 B( |1 n4 A" m# W
* W# z' w4 B% [4 Z- _; R9 ]2 r
   CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。 : W7 }3 N' }* ]- ^  C) p$ g, Y

1 _+ j- U# Y+ r5 G! l, w9 V5 B   CODEBASE可以直接指向一个OCX 文件或者DLL文件:
# @4 r9 |' A. I% r9 R" ]' e
' |5 T4 i; c$ h% [$ b5 B9 HCODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
& p0 [. ^  g5 F4 c) n( ?3 t+ O. P% B7 C
  因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 ! y9 [: U- X& {1 F6 u0 D" i) Y
9 J* g4 ^7 w* D9 c
  如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
( Z: E" _4 F5 B4 @
2 w1 u$ J8 u7 X. x1 {8 [CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
$ K" X8 a" u& {3 k" M8 A) R/ O
  如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。
wagjm 该用户已被删除
发表于 2003-12-25 09:34:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-9 08:51 , Processed in 0.034383 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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