為MFC和ATL控制項創建簽署的CAB檔

有關於C/C++的語法, 程式等
回覆文章
頭像
tim
文章: 1379
註冊時間: 2008年 11月 26日, 00:49

為MFC和ATL控制項創建簽署的CAB檔

文章 tim »

為MFC和ATL控制項創建簽署的CAB檔

轉貼自:
http://bbs.ityg.com/viewthread.php?tid= ... d=6FJ3ONKd

微軟網站上的資料:
http://msdn.microsoft.com/library/defau ... f_file.asp

2001-12-20  microsoft

  如果您計畫通過Internet銷售 MFC控制項和ATL 控制項,您應該將其打包成簽署的小巧(Cabinet -CAB) 檔。簽署檔確保用戶下載您的控制項時源代碼是安全的。一個CAB檔包含一個您的控制項及其安裝資訊(比如,都需要哪些動態連結程式庫DLL和OCX一起安裝)的壓縮版本。

  創建和簽署CAB檔的工具包含於Visual C++ 5.0 光碟中的 CAB&SIGN 目錄下面。 該目錄下的公用程式在您安裝Visual C++時並不會自動地一起安裝,因此您必須將CAB&SIGN 目錄下面的內容拷貝到您的硬碟驅動器中。

  在簽署檔之前,您需要有一個軟體出版商證明書(Software Publisher Certificate)。您必須向證書發放機構(Certification Authority)申請自己的證書。利用CAB&SIGN目錄下面的工具,您能夠創建一個用於測試的測試證明書,但是該證明書不能用於簽署發售的代碼。有關申請軟體出版商證明書的資訊,請參考步驟 1 。

  下麵是創建簽署CAB檔的步驟 :

   1 獲得一個軟體出版商證明書 (您只需要這一次申請就可以永久使用)

   2 創建 CAB 文件

   3 簽署您的檔

   4 將簽署過的 CAB檔嵌入一個Web頁(可選項)獲得一個軟體出版商證明書

  在簽署檔之前,您需要有一個軟體出版商證明書(SPC)。為此,您必須向證書發放機構(Certification Authority)提出申請。在申請過程中,您必須生成一個密匙對,並向證書發放機構提供證明信息,比如說您的名字、地址以及公共密匙。而且,您必須作出具有法律約束力的誓言:您不能也將不會發佈您知道或者應該知道其中包含了病毒的軟體,或者是惡意破壞用戶的機器或代碼。

  有關如何得到軟體出版商證明書更詳盡的資訊,請參考Signing Code with Microsoft's Authenticode。若要申請該證書,請參考 Digital Certificates for Authenticode ;若要創建一個測試證書來測試簽署檔,請參考Making A Test Software Publisher Certificate.

  證書發放機構生成一個符合工業標準X.509證書格式(包含版本3擴展)的軟體出版商證明書。該證書確定並且包含您的公共密匙,並以證書發放機構存檔作為參考,把一個拷貝以電子郵件的方式返回給您。收到該證書之後,您應該在所有要發佈的、用私人密匙簽署的軟體當中,包含一份該證書的拷貝。

  獲得一個軟體出版商證明書

  您可以使用Visual C++ 5.0 光碟中CAB&SIGN目錄下的 MAKECERT和 CERT2SPC 公用程式,做一個測試軟體出版商證明書。注意,該測試軟體出版商證明書對真正的軟體發佈無效,但是能夠被用來測試您代碼的簽署。

  比如,要做一個私人密匙檔MYKEY.PVK 和一個公司證書CERT.CER,則運行公用程式MAKECERT,其命令如下:

C:CAB&SIGNMAKECERT
-u: MyKey
-n: CN = MySoftwareCompany
-k: MYKEY.PVK CERT.CER

  MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程式 MAKECERT 在命令行選項中區分大小寫,因此您必須使用小寫的-u、-n以及-k;-n選項的值必須是大寫的CN=。

  做一個名為CERT.SPC測試軟體出版商證明書,則運行公用程式CERT2SPC,命令如下:

C:CAB&SIGNCERT2SPC C:CAB&SIGNROOT.CER CERT.CER CERT.SPC

  注意CERT.SPC檔是利用您剛使用MAKECERT創建的CERT.CER檔以及CAB&SIGN目錄下面的ROOT.CER文件創建的 。

  創建一個 CAB檔

  這一部分描述如何創建能在互連網上分派ATL和MFC組件的CAB檔。如果您要瞭解有關CAB檔的更多資訊,請參考Cabinet檔參考書目(File Reference),該檔位於平臺軟體發展工具包(Platform SDK,包含在Visual C++ 5.0聯機文檔中)的設置和系統管理服務(Setup and System Management Services)部分的Setup APIOverviewCabinet Files目錄下面。

  創建一個 CAB檔:

  創建一個INF檔。

  運行公共常式CABARC(在光碟上的CAB&SIGN目錄中)。例如:

C:CAB&SIGNCABARC -s 6144
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF

  CABARC 創建了一個名為MYCTL.CAB的CAB文件。

  您必須在您的原始檔案(INF、OCX以及DLL檔)目錄下面運行CABARC。存檔在CAB 檔中的檔需要在命令行列出,次序同它們在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然後是NEEDED2.DLL,最後是MYCTL.OCX。

  -s選項為代碼簽署保留空間。n 命令指定您想創建的是CAB文件。CABARC 命令和選項的說明可以查看,其方式是在命令行鍵入CABARC:

  C:CAB&SIGNCABARC

  創建一個INF檔

  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 APIOverviewINF Files目錄下的內容。

  作為示例,下面的INF是用來為ATL多邊形控制項創建一個CAB檔的。 您可以通過從Visual C++ 5.0光碟下載ATL POLYGON示例程式來創建POLYGON.DLL,並創建一個最小版本。創建該最小版本另外需要一個DLL即 ATL.DLL。ATL.DLL要先於POLYGON.DLL註冊,因此首先把ATL.DLL 放置到INF當中。

; Sample INF file for POLYGON.DLL
[version]
; version signature (same for both NT and Win95) do not remove
signature="$CHICAGO$"
AdvancedINF=2.0

[Add.Code]
polygon.dll=polygon.dll
atl.dll=atl.dll

; needed DLL
[atl.dll]
file-win32-x86=thiscab
FileVersion=2,00,0,7024
DestDir=11
RegisterServer=yes

[polygon.dll]
file-win32-x86=thiscab
clsid={4CBBC676-507F-11D0-B98B-000000000000}
FileVersion=1,0,0,1
RegisterServer=yes
; end of INF file

  該INF指定了系統需要安裝特定版本的ATL.DLL。如果系統中還沒有該檔,則需要從和該INF一起創建的CAB檔下載。"thiscab" 是一個關鍵字,意指包含該INF的CAB檔。您也可以從網上下載所需要的DLL檔,只要指定一個HTTP 網址即可,絕對路徑或者相對路徑都可以,比如:

  file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL

  關鍵字"file-win32-x86" 指定平臺是 x86。

  得到一個檔的版本號的過程是:在Windows NT或者Windows 95 Explorer中右鍵點擊該檔;從彈出列表中選擇Properties,然後在接著彈出的對話方塊中選擇版本標籤。有時,您可能需要在檔版本中插入一個額外的0 。比如,對話方塊中顯示ATL.DLL的版本號是2.00.7024,在INF檔中則變為2,00,0,7024 。

  "DestDir"指的是裝載目錄或者檔的位址: 11 指定為系統目錄 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 規定為視窗目錄、WINDOWS或者WINNT。如果沒有指定DestDir(典型情況),則代碼從固定的OCCACHE目錄裝載。

  "clsid" 指的是要安裝控制項的CLSID。

  創建 INF檔後,再運行CABARC公用程式(在Visual C++ 5.0光碟上的CAB&SIGN目錄中)創建CAB檔。您必須在您的原始檔案目錄下面運行CABARC。存檔在CAB 檔中的檔需要在命令行列出,次序同它們在INF文件中完全一致。比如,從上面的INF檔為多邊形控制項做一個CAB檔,需要使用下面的命令 :

  C:CAB&SIGNCABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF

  該CAB檔包含ATL.DLL和POLYGON.DLL的壓縮版本,以及將它們展開到POLYGON.INF 檔所需要的資訊。

  有關創建一個下載MFC控制項的CAB檔的示例,請參考MFC 4.2b Component Download Information.您需要包含在MFC控制項中的DLL檔有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。

  簽署一個CAB檔

  使用Code Signing Wizard簽署一個CAB檔:

  1. 運行公用程式 SIGNCODE (在Visual C++ 5.0光碟的CAB&SIGN 目錄下),啟動Code Signing Wizard。

    C:CAB&SIGNSIGNCODE

  2. 在Code Signing Wizard對話方塊當中,點擊Next前進到下一頁。

  3. 在您想簽署那一個程式? 編輯框中,鍵入您想簽署的CAB檔。

  4.在您想在證書中使用什麼名字? 編輯框中,鍵入您想在證書中使用的名字。


  5. 點擊Next,前進到下一頁。

  6. 在 您想將該程式簽署在哪一個軟體發展商證書下面? 編輯框中,鍵入軟體發展商證書(SPC)檔案名。

  7. 在您要在該證書的哪一個檔中查找密碼、密匙? 編輯框中,鍵入私人密匙(PVK)檔案名。

  8. 連續兩次點擊 Next前進到最後一頁。

  9.點擊Sign,簽署CAB 檔。您的檔將被數位化簽署。

  您可以不使用CAB檔直接簽署您的DLL和OCX 。CAB檔的好處在於它是壓縮的,而且,如果和INF檔一起使用,可以將所有必要代碼捆綁在一起。

  將簽署過的 CAB檔嵌入一個Web頁

  ATL和MFC控制項使用標籤嵌入網頁。在標籤,您需要為該控制項指定三個屬性 :

   ID - 控制項名稱

   CLASSID - 控制項的CLSID

   CODEBASE - 下載控制項的位置。CODEBASE 可以指向許多不同的檔類型。

   CODEBASE可以直接指向一個OCX 檔或者DLL檔:

CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"

  因為這僅僅完成了DLL或OCX檔的下載和安裝,任何必要的DLL支持必須已經裝載到了客戶機上。

  如果您在CAB檔中包含了選項版本號,它應該指向要下載的控制項。例如,如果POLYGON.DLL有一個版本號1,0,0,1,則CAB檔的版本號也必須是1,0,0,1:

CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"

  如果您沒有包含選項版本號,則不能替換同一個元件(如果它們出現在客戶機上的話)的老版本號。
多多留言, 整理文章, 把經驗累積下來.....
回覆文章