ActiveX控件的WEB發佈

 

ActiveX控件的WEB發佈有兩部分組成

1. ActiveX控件的製作部分要求
    WEB發佈對ActiveX控件的編碼生成部分的要求就是必須實現ActiveX控件的安全接口“IObjectSafety 接口”:

   

2. ActiveX控件的發佈要求

        1)製作ActiveX空間的CAB包 :

創建 CAB 文件請參見
爲 MFC 和 ATL 控件創建簽名 CAB 文件本節內容描述如何創建在 Internet 上分發 ATL 和 MFC 控件的 CAB 文件。如果需要有關 CAB 文件的更多信息,請參見 Platform SDK 文檔中的壓縮文件參考一文(在 MSDN Library/Setup 和 System Administration/Setup/Setup API/Overview/Cabinet Files 目錄下)。
創建 CAB 文件:
創建 INF 文件。
運行 CABARC 實用工具。
創建 INF 文件
INF 文件是一個文本文件,用以指定爲控件的運行而需要顯示或下載的文件(如 DLL 文件或其他 OCX 文件)。INF 文件使您得以將所有所需的文件捆綁在一個壓縮的 CAB 文件中。默認情況下,版本號同用戶硬盤上的現有文件相同的文件不下載。有關 INF 文件及其選項的更多信息,包括如何創建與平臺無關的 INF 文件,請參見 Platform SDK 文檔中的關於 INF 文件和使用 INF 文件(在 MSDN Library/Setup 和 System Administration/Setup/Setup API/Overview/Setup Applications 目錄下)。
舉例來說,下面的 INF 文件用於爲 ATL Polygon 控件創建 CAB 文件。可通過從 Visual C++ CD 下載 ATL POLYGON 示例文件和生成 MinSize 版本來生成 POLYGON.DLL。如果生成了 Polygon 控件的 MinSize 版,還需要另外一個 DLL,即 ATL.DLL。由於需要在 POLYGON.DLL 之前註冊 ATL.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。如果 ATL.DLL 尚未存在於系統中,它將從用此 INF 創建的 CAB 文件中下載。“thiscab”是一個關鍵字,表示 CAB 包含此 INF。也可通過指定一條絕對或相對路徑,從一個 HTTP 位置下載所需的 DLL,例如:
file-win32-x86=http://example.microsoft.com/mydir/NEEDED.DLL
關鍵字“file-win32-x86”將平臺標識爲 x86 特定的。
可通過在 Windows 資源管理器中的文件上單擊鼠標右鍵來獲取文件的版本號。從顯示的列表中選擇“屬性”,然後在顯示的對話框中選擇“版本”選項卡。有時需要在文件版本中額外插入一個 0。例如,在對話框中 ATL.DLL 的版本號顯示爲 2.00.7024。而在 INF 文件中,這變爲 2, 00, 0, 7024。
“DestDir”是將要加載文件的目錄所在的位置:11 指定系統目錄爲 WINDOWS/SYSTEM 或 WINNT/SYSTEM32;10 指定 Windows 目錄、WINDOWS 或 WINNT。如果未指定任何 DestDir(典型情況),則代碼安裝在固定的 OCCACHE 目錄中。
“clsid”是將要安裝的控件的 CLSID。
創建了 INF 文件後,運行 CABARC 實用工具(可在 Mssdk/Bin 目錄中找到)以創建 CAB 文件。應在包含源文件的目錄下運行 CABARC。在命令行上,按源文件出現在 INF 中的順序排列它們,並將 INF 文件放在最後。例如,若要從上面的 INF 文件生成 Polygon 控件的 CAB 文件,請使用下面的命令:
C:/MSSDK/BIN/CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
POLYGON.CAB 文件包含一個 ATL.DLL 和 POLYGON.DLL 的壓縮版本,同時還含有在 POLYGON.INF 文件中將其解壓縮所需的信息。
有關如何分析及從 CAB 文件中解壓縮組件的示例,請參見 http://msdn.microsoft.com/visualc/downloads/samples.asp(選擇 CabView 鏈接)上 MSDN Online Code Center 中的 CabView 示例。
需要在 MFC 控件中包含的 DLL 文件有 MSVCRT.DLL、MFC42.DLL 和 OLEPRO32.DLL。
運行 CABARC 實用工具
可在 Mssdk/Bin 目錄中找到 CABARC 實用工具。例如:
C:/MSSDK/BIN/CABARC -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:/MSSDK/BIN/CABARC


淺析ActiveX控件的CAB壓縮
 
任鳳華
 
 
摘  要  本文簡單介紹了CAB壓縮,以及使用WinCAB將ActiveX控件壓縮爲CAB文件的具體步驟。
關鍵詞  ActiveX控件;CAB壓縮;WinCAB;INF文件
 
1. 引言
ActiveX控件技術是從OLE基礎上發展起來的,是將OLE進行了擴展從而使其適應Internet、Intranet、商業應用程序等的開發。當ActiveX控件的程序代碼在Internet上傳輸時,使用壓縮技術傳輸程序代碼變得非常有意義。
從另一方面來看,如果ActiveX控件還調用到其他的DLL程序模塊,那麼IE也必須把這些程序下載到本地來。爲此,Microsoft採用了慣用的CAB壓縮方法,它把ActiveX控件應用程序以及相關的其他文件放在同一個CAB文件中,然後在CODEBASE屬性中指定CAB文件的URL路徑。當IE找到CODEBASE屬性時,它會自動解析URL地址從而把CAB文件解壓到客戶機的臨時目錄,然後註冊有關文件,調用COM API函數創建ActiveX控件對象。這樣就完成了ActiveX控件的傳輸。
  
2. CAB壓縮技術簡介
微軟公司在發行Windows 95、Plus!95等軟件時採用了一種全新的CAB壓縮包形式,它具有壓縮率高、安全性好、不易受到破壞等優點,深受廣大用戶及軟件製作商的歡迎。許多用戶甚至因此希望將自己的數據文件改用CAB壓縮包的形式加以壓縮、備份,以儘可能的減少備份文件所佔用的磁盤空間,並提高它們的安全性。目前製作CAB文件的軟件有主要有Cabarc和WinCAB。
 Cabarc是一個用於壓縮、列出壓縮包中的文件、解壓CAB文件的工具。Cabarc支持通配符和遞歸路徑搜索。不過Cabarc使用一個類似於常用的壓縮工具的命令行界面,
並且有較多的參數,與現在主流的Windows操作系統不太協調,使用起來不是很方便。
而WinCAB是一種可視化的全新的CAB壓縮包製作軟件,它具有采用圖形界面、支持分卷壓縮、可製作具有自解包功能的CAB壓縮包(*.EXE文件格式)等優秀功能,這就從根本上解決了CAB壓縮包的製作問題。需要注意的是在運行WinCAB.exe時,必須確保makecab.exe文件也在相同的目錄下。
本文就以WinCAB爲例來介紹ActiveX控件的CAB文件的製作過程。
 
3. 將ActiveX控件壓縮成CAB文件
主要步驟有:
1)註冊YourCtl.ocx控件。
2)建立YourCtl.inf文件。
   INF文件的格式如下:(在使用Visual C++6.0的情況下)
   [version]
   signature="$CHICAGO$"
   AdvancedINF=2.0
[Add.Code]
   YourCtl.ocx=YourCtl.ocx
   mfc42.dll=mfc42.dll
   msvcrt.dll=msvcrt.dll
   olepro32.dll=olepro32.dll
[YourCtl.ocx]
   file-win32-x86=thiscab
   clsid={YourCtl.ocx的CLSID}  //在YourCtl.odl文件中可以找到
   FileVersion=1,0,0,1
   RegisterServer=yes
[msvcrt.dll]
   FileVersion=6,0,8168,0    
   hook=mfc42installer
[mfc42.dll]
   FileVersion=6,0,8168,0
   hook=mfc42installer
[olepro32.dll]
   FileVersion=5,0,4261,0
   hook=mfc42installer
[mfc42installer]
   file-win32-x86=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab
   run= % EXTRACT_DIR % /mfc42.exe
  
   這裏需要說明的是上述msvcrt.dll、mfc42.dll、olepro32.dll的FileVersion是根據VC不同的版本而異的,例如在VC5.0sp3中就應該如下
   olepro32.dll   5,0,4230,1
   mfc42.dll     4,21,0,7303
   msvcrt.dll     5,0,0,7303
    每個VC版本都有不同的版本號,這裏只介紹常見的兩種。 另外mfc42installer的下載路徑除了VC4.1和更早版本使用http://activex.microsoft.com/controls/vc/mfc40.cab外,其他版本都使用http://activex.microsoft.com/controls/vc/mfc42.cab
3)啓動WinCAB開始壓縮。(其中注意Makecab.exe要在WinCAB目錄下)
   i)啓動WinCAB,然後執行“Cabinet”菜單的“New”命令或單擊快捷工具欄上的“New cabinet”按鈕,準備製作新的CAB壓縮包。
 ii)單擊快捷工具欄上的“Add file(s) to cabinet”按鈕,打開“Add file(s) to cabinet”對話框。
iii)選擇欲添加到CAB壓縮包中的文件後單擊“打開”按鈕,將它們添加到WinCAB的文件列表中。這裏只需要添加YourCtl.ocx和YourCtl.inf兩個文件。
iv)在WinCAB快捷工具欄的“Cabinet path and name”框中輸入或利用“Browse for path and name”按鈕指定CAB壓縮包的路徑及文件名。
v)在“Cabinet size”欄中指定CAB壓縮包的尺寸。
vi)在“Compression method”框中選擇合適的壓縮方式。
vii)單擊“Save cabinet”按鈕,WinCAB即會按照用戶的要求進行壓縮。
viii)壓縮完成後,WinCAB會給出一個“WinCAB Report”的報告框,向廣大用戶報告有關文件個數、壓縮前後的文件尺寸、壓縮率、壓縮時間等情況。至此,一個CAB文件就生成了。
4. 結束語
  由於CAB的壓縮率比我們常用的ARJ、ZIP、RAR等壓縮包要高許多(約20%),從而進一步的減少了壓縮文件所佔用的磁盤空間,當採用該技術在Internet上傳輸ActiveX控件時既減少了網絡流量,也加快了網頁打開的速度。
另外,由於CAB壓縮包具有“只讀”屬性,在創建完成後即不允許再作任何修改、刪除,因此不易受到病毒、誤操作等問題的影響,安全性也具有保證,實爲廣大用戶在Windows 下進行文件的壓縮、備份工作時的最佳選擇。
注:**基金項目**,國家973計劃,(編號:G1998030600)。
關於證書和簽名     -|zuiwanting 發表於 2006-5-24 9:58:00 
 
/Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1/Bin下有關於證書和簽名相關工具
1。Makecert.exe ---證書創建工具
2。Cert2Spc.exe ---發行者證書測試工具
3。Signcode.exe ---文件簽名工具
建立自己的根證書:
makecert -sk myPK -ss myName -n "CN=LUO31工作室" -r c:/luo31.cer
      sk-表示主題的密鑰容器位置,ss-主題的證書存儲名稱, n-證書頒發對象,r-證書存儲位置;
如果你需要導出私鑰文件,請不要使用sk,而換作s,eg:makecert  -ss myName -n "CN=LUO31工作室" -sv c:/luo31.pvk  -r c:/luo31.cer
建立自根證書授權的子證書:
makecert -sk "myPK" -is myName -n "CN=luo31" -$ commercial -ic c:/luo31.cer  c:/31.cer
      sk-表示主題的密鑰容器位置,is-頒發者的證書存儲名稱, n-證書頒發對象,ic-頒發者的證書存儲位置,-$-授權範圍(用於代碼簽名);
使用Cert2Spc生成spc發行者證書(可選):
cert2spc c:/31.cer c:/31.spc
使用signcode爲你的程序,庫或cab包簽名:
雙擊signcode,或在控制檯鍵入signcode,不帶參數會啓動簽名嚮導。在第三步選擇“自定義選項”,第四步選擇“從文件選擇”選擇31.spc或31.cer,第五步選擇“CSP中的私鑰”,在密鑰容器中選擇我們定義的myPK,其他步驟默認即可,如果想添加時間戳,請在時間戳服務器地址上鍵入:(免費時間戳認證)http://timestamp.verisign.com/scripts/timstamp.dll ;
完成後,觀察你所簽名的文件屬性,應該已經添加數字簽名項 


3.  ActiveX控件在頁面上的引用

 

 <OBJECT id="axGraphOcxSCADA" style="Z-INDEX: 102; LEFT: 160px; WIDTH: 784px; POSITION: absolute; TOP: 80px; HEIGHT: 536px"
    codeBase="GraphOcx.CAB#version=1,0,0,3" classid="clsid:87186EA1-4D89-4F3E-9D25-1F03F0DDDB95"
    name="axGraphOcxSCADA" VIEWASTEXT>
    <PARAM NAME="_Version" VALUE="65536">
    <PARAM NAME="_ExtentX" VALUE="20743">
    <PARAM NAME="_ExtentY" VALUE="14182">
    <PARAM NAME="_StockProps" VALUE="0">
   </OBJECT>

如何作爲安全標記 MFCActiveX 控件對於腳本和初始化
察看本文應用於的產品
注意:這篇文章是由無人工介入的自動的機器翻譯系統翻譯完成。這些文章是微軟爲不懂英語的用戶提供的, 以使他們能夠理解這些文章的內容。微軟不保證機器翻譯的正確度,也不對由於內容的誤譯或者客戶對它的使用所引起的任何直接的, 或間接的可能的問題負責。
文章編號 : 161873
最後修改 : 2005年9月1日
修訂 : 3.0

概要
默認情況下, MFCActiveX 控件不標記爲對於腳本安全和對初始化安全。 這將成爲明顯當控件運行 InternetExplorer 中與安全級別設置爲中型或高。 是這些模式, 以警告可能顯示控件的數據是不安全或, 控件不是對於要使用腳本安全。

可以使用兩種方法, 控件可用於消除這些錯誤。 第涉及到控件實現 IObjectSafety 接口, 是用於控件, 要更改其行爲併成爲如果一個 Internet 瀏覽器的上下文中運行 " 安全 "。 第二涉及修改控件的 DllRegisterServer 函數以註冊表中 " 安全 " 標記該控件。 本文介紹秒的這些方法。 首方法, 實現 IObjectSafety 接口, 將講述 InternetClientSDK 中。

請記住, 控件應只標記是否實際上, 安全, 安全。 請到 InternetClientSDK 文檔有關的此說明。 請組件開發 Section 下參閱 " 安全初始化和腳本對 ActiveX 控件 "。

注意 本文不涉及如何對下載安全標記控件。 有關代碼下載和代碼簽名, 上詳細信息請參閱 InternetClientSDK 到。
 回到頂端

更多信息
請按照下列步驟來 MFC ActiveX 控件標記爲對於腳本安全和對初始化安全: 1. 通過向項目添加下列 cathelp.h 和 cathelp.cpp 文件實現 CreateComponentCategory 和 RegisterCLSIDInCategory Helper 函數。
 回到頂端

Cathelp.h
      #include "comcat.h"

      // Helper function to create a component category and associated
      // description
      HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);

      // Helper function to register a CLSID as belonging to a component
      // category
      HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
       回到頂端

Cathelp.cpp
      #include "comcat.h"

      // Helper function to create a component category and associated
      // description
      HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
      {
         ICatRegister* pcr = NULL ;
         HRESULT hr = S_OK ;

         hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                               NULL,
                               CLSCTX_INPROC_SERVER,
                               IID_ICatRegister,
                               (void**)&pcr);
         if (FAILED(hr))
            return hr;

         // Make sure the HKCR/Component Categories/{..catid...}
         // key is registered
         CATEGORYINFO catinfo;
         catinfo.catid = catid;
         catinfo.lcid = 0x0409 ; // english

         // Make sure the provided description is not too long.
         // Only copy the first 127 characters if it is
         int len = wcslen(catDescription);
         if (len>127)
            len = 127;
         wcsncpy(catinfo.szDescription, catDescription, len);
         // Make sure the description is null terminated
         catinfo.szDescription[len] = '/0';

         hr = pcr->RegisterCategories(1, &catinfo);
         pcr->Release();

         return hr;
      }

      // Helper function to register a CLSID as belonging to a component
      // category
      HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
      {
         // Register your component categories information.
         ICatRegister* pcr = NULL ;
         HRESULT hr = S_OK ;
         hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                               NULL,
                               CLSCTX_INPROC_SERVER,
                               IID_ICatRegister,
                               (void**)&pcr);
         if (SUCCEEDED(hr))
         {
            // Register this category as being "implemented" by
            // the class.
            CATID rgcatid[1] ;
            rgcatid[0] = catid;
            hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
         }

         if (pcr != NULL)
            pcr->Release();

         return hr;
      }
      
2. 修改 DllRegisterServer 來標記作爲安全控件。 在項目中一個 .cpp 文件中找到 DllRegisterServer 的實現。 需要在此 .cpp 文件添加一些操作。 包括實現 CreateComponentCategory 和 RegisterCLSIDInCategory 文件:
      #include "CatHelp.h"
      定義 GUID 與安全組件類別:
      const CATID CATID_SafeForScripting     =
      {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
      const CATID CATID_SafeForInitializing  =
      {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
      定義與控件關聯 GUID。 爲簡單起見, 您可借用 GUID 從 IMPLEMENT_OLECREATE_EX 宏對控件主 .cpp 文件中。 略微調整格式: 它類似下面這樣(注意這裏定義的就是將來ActiveX控件發佈時生成的classid  如:classid="clsid:87186EA1-4D89-4F3E-9D25-1F03F0DDDB95"
      const GUID CDECL BASED_CODE _ctlid =
      { 0x43bd9e45, 0x328f, 0x11d0,
              { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
      要將控件標記爲腳本和初始化, 作爲兩個安全如下修改 DllRegisterServer 函數:
      STDAPI DllRegisterServer(void)
      {
          AFX_MANAGE_STATE(_afxModuleAddrThis);

          if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
              return ResultFromScode(SELFREG_E_TYPELIB);

          if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
              return ResultFromScode(SELFREG_E_CLASS);

          if (FAILED( CreateComponentCategory(
                  CATID_SafeForScripting,
                  L"Controls that are safely scriptable") ))
                return ResultFromScode(SELFREG_E_CLASS);

          if (FAILED( CreateComponentCategory(
                  CATID_SafeForInitializing,
                  L"Controls safely initializable from persistent data") ))
                return ResultFromScode(SELFREG_E_CLASS);

          if (FAILED( RegisterCLSIDInCategory(
                  _ctlid, CATID_SafeForScripting) ))
                return ResultFromScode(SELFREG_E_CLASS);

          if (FAILED( RegisterCLSIDInCategory(
                  _ctlid, CATID_SafeForInitializing) ))
                return ResultFromScode(SELFREG_E_CLASS);

          return NOERROR;
      }
      
您將通常不修改 DllUnregisterServer 函數: 因此兩 • 您不希望刪除組件類別, 因爲它可能使用其他控件。 
• DllUnregisterServer 雖然有是 UnRegisterCLSIDInCategory 函數定義, 默認從註冊表刪除控件的項完全。 因此, 從控件註冊刪除類別是很少使用。 
應編譯和註冊控件, 後, 在註冊表中找到以下項:
   HKEY_CLASSES_ROOT/Component
   Categories/{7DD95801-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT/Component
   Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT/CLSID/{"your controls GUID"}/Implemented
   Categories/{7DD95801-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT/CLSID/{"your controls GUID"}/Implemented
   Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}ActiveX控件的WEB發佈有兩部分組成

1. ActiveX控件的製作部分要求

    WEB發佈對ActiveX控件的編碼生成部分的要求就是必須實現ActiveX控件的安全接口“IObjectSafety 接口”:

   

如何作爲安全標記 MFCActiveX 控件對於腳本和初始化
察看本文應用於的產品
注意:這篇文章是由無人工介入的自動的機器翻譯系統翻譯完成。這些文章是微軟爲不懂英語的用戶提供的, 以使他們能夠理解這些文章的內容。微軟不保證機器翻譯的正確度,也不對由於內容的誤譯或者客戶對它的使用所引起的任何直接的, 或間接的可能的問題負責。
文章編號 : 161873
最後修改 : 2005年9月1日
修訂 : 3.0

概要
默認情況下, MFCActiveX 控件不標記爲對於腳本安全和對初始化安全。 這將成爲明顯當控件運行 InternetExplorer 中與安全級別設置爲中型或高。 是這些模式, 以警告可能顯示控件的數據是不安全或, 控件不是對於要使用腳本安全。

可以使用兩種方法, 控件可用於消除這些錯誤。 第涉及到控件實現 IObjectSafety 接口, 是用於控件, 要更改其行爲併成爲如果一個 Internet 瀏覽器的上下文中運行 " 安全 "。 第二涉及修改控件的 DllRegisterServer 函數以註冊表中 " 安全 " 標記該控件。 本文介紹秒的這些方法。 首方法, 實現 IObjectSafety 接口, 將講述 InternetClientSDK 中。

請記住, 控件應只標記是否實際上, 安全, 安全。 請到 InternetClientSDK 文檔有關的此說明。 請組件開發 Section 下參閱 " 安全初始化和腳本對 ActiveX 控件 "。

注意 本文不涉及如何對下載安全標記控件。 有關代碼下載和代碼簽名, 上詳細信息請參閱 InternetClientSDK 到。
 回到頂端

更多信息
請按照下列步驟來 MFC ActiveX 控件標記爲對於腳本安全和對初始化安全: 1. 通過向項目添加下列 cathelp.h 和 cathelp.cpp 文件實現 CreateComponentCategory 和 RegisterCLSIDInCategory Helper 函數。
 回到頂端

Cathelp.h
      #include "comcat.h"

      // Helper function to create a component category and associated
      // description
      HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);

      // Helper function to register a CLSID as belonging to a component
      // category
      HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
       回到頂端

Cathelp.cpp
      #include "comcat.h"

      // Helper function to create a component category and associated
      // description
      HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
      {
         ICatRegister* pcr = NULL ;
         HRESULT hr = S_OK ;

         hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                               NULL,
                               CLSCTX_INPROC_SERVER,
                               IID_ICatRegister,
                               (void**)&pcr);
         if (FAILED(hr))
            return hr;

         // Make sure the HKCR/Component Categories/{..catid...}
         // key is registered
         CATEGORYINFO catinfo;
         catinfo.catid = catid;
         catinfo.lcid = 0x0409 ; // english

         // Make sure the provided description is not too long.
         // Only copy the first 127 characters if it is
         int len = wcslen(catDescription);
         if (len>127)
            len = 127;
         wcsncpy(catinfo.szDescription, catDescription, len);
         // Make sure the description is null terminated
         catinfo.szDescription[len] = '/0';

         hr = pcr->RegisterCategories(1, &catinfo);
         pcr->Release();

         return hr;
      }

      // Helper function to register a CLSID as belonging to a component
      // category
      HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
      {
         // Register your component categories information.
         ICatRegister* pcr = NULL ;
         HRESULT hr = S_OK ;
         hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                               NULL,
                               CLSCTX_INPROC_SERVER,
                               IID_ICatRegister,
                               (void**)&pcr);
         if (SUCCEEDED(hr))
         {
            // Register this category as being "implemented" by
            // the class.
            CATID rgcatid[1] ;
            rgcatid[0] = catid;
            hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
         }

         if (pcr != NULL)
            pcr->Release();

         return hr;
      }
      
2. 修改 DllRegisterServer 來標記作爲安全控件。 在項目中一個 .cpp 文件中找到 DllRegisterServer 的實現。 需要在此 .cpp 文件添加一些操作。 包括實現 CreateComponentCategory 和 RegisterCLSIDInCategory 文件:
      #include "CatHelp.h"
      定義 GUID 與安全組件類別:
      const CATID CATID_SafeForScripting     =
      {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
      const CATID CATID_SafeForInitializing  =
      {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
      定義與控件關聯 GUID。 爲簡單起見, 您可借用 GUID 從 IMPLEMENT_OLECREATE_EX 宏對控件主 .cpp 文件中。 略微調整格式: 它類似下面這樣(注意這裏定義的就是將來ActiveX控件發佈時生成的classid  如:classid="clsid:87186EA1-4D89-4F3E-9D25-1F03F0DDDB95"
      const GUID CDECL BASED_CODE _ctlid =
      { 0x43bd9e45, 0x328f, 0x11d0,
              { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
      要將控件標記爲腳本和初始化, 作爲兩個安全如下修改 DllRegisterServer 函數:
      STDAPI DllRegisterServer(void)
      {
          AFX_MANAGE_STATE(_afxModuleAddrThis);

          if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
              return ResultFromScode(SELFREG_E_TYPELIB);

          if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
              return ResultFromScode(SELFREG_E_CLASS);

          if (FAILED( CreateComponentCategory(
                  CATID_SafeForScripting,
                  L"Controls that are safely scriptable") ))
                return ResultFromScode(SELFREG_E_CLASS);

          if (FAILED( CreateComponentCategory(
                  CATID_SafeForInitializing,
                  L"Controls safely initializable from persistent data") ))
                return ResultFromScode(SELFREG_E_CLASS);

          if (FAILED( RegisterCLSIDInCategory(
                  _ctlid, CATID_SafeForScripting) ))
                return ResultFromScode(SELFREG_E_CLASS);

          if (FAILED( RegisterCLSIDInCategory(
                  _ctlid, CATID_SafeForInitializing) ))
                return ResultFromScode(SELFREG_E_CLASS);

          return NOERROR;
      }
      
您將通常不修改 DllUnregisterServer 函數: 因此兩 • 您不希望刪除組件類別, 因爲它可能使用其他控件。 
• DllUnregisterServer 雖然有是 UnRegisterCLSIDInCategory 函數定義, 默認從註冊表刪除控件的項完全。 因此, 從控件註冊刪除類別是很少使用。 
應編譯和註冊控件, 後, 在註冊表中找到以下項:
   HKEY_CLASSES_ROOT/Component
   Categories/{7DD95801-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT/Component
   Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT/CLSID/{"your controls GUID"}/Implemented
   Categories/{7DD95801-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT/CLSID/{"your controls GUID"}/Implemented
   Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}2. ActiveX控件的發佈要求

        1)製作ActiveX空間的CAB包 :

創建 CAB 文件請參見
爲 MFC 和 ATL 控件創建簽名 CAB 文件本節內容描述如何創建在 Internet 上分發 ATL 和 MFC 控件的 CAB 文件。如果需要有關 CAB 文件的更多信息,請參見 Platform SDK 文檔中的壓縮文件參考一文(在 MSDN Library/Setup 和 System Administration/Setup/Setup API/Overview/Cabinet Files 目錄下)。
創建 CAB 文件:
創建 INF 文件。
運行 CABARC 實用工具。
創建 INF 文件
INF 文件是一個文本文件,用以指定爲控件的運行而需要顯示或下載的文件(如 DLL 文件或其他 OCX 文件)。INF 文件使您得以將所有所需的文件捆綁在一個壓縮的 CAB 文件中。默認情況下,版本號同用戶硬盤上的現有文件相同的文件不下載。有關 INF 文件及其選項的更多信息,包括如何創建與平臺無關的 INF 文件,請參見 Platform SDK 文檔中的關於 INF 文件和使用 INF 文件(在 MSDN Library/Setup 和 System Administration/Setup/Setup API/Overview/Setup Applications 目錄下)。
舉例來說,下面的 INF 文件用於爲 ATL Polygon 控件創建 CAB 文件。可通過從 Visual C++ CD 下載 ATL POLYGON 示例文件和生成 MinSize 版本來生成 POLYGON.DLL。如果生成了 Polygon 控件的 MinSize 版,還需要另外一個 DLL,即 ATL.DLL。由於需要在 POLYGON.DLL 之前註冊 ATL.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。如果 ATL.DLL 尚未存在於系統中,它將從用此 INF 創建的 CAB 文件中下載。“thiscab”是一個關鍵字,表示 CAB 包含此 INF。也可通過指定一條絕對或相對路徑,從一個 HTTP 位置下載所需的 DLL,例如:
file-win32-x86=http://example.microsoft.com/mydir/NEEDED.DLL
關鍵字“file-win32-x86”將平臺標識爲 x86 特定的。
可通過在 Windows 資源管理器中的文件上單擊鼠標右鍵來獲取文件的版本號。從顯示的列表中選擇“屬性”,然後在顯示的對話框中選擇“版本”選項卡。有時需要在文件版本中額外插入一個 0。例如,在對話框中 ATL.DLL 的版本號顯示爲 2.00.7024。而在 INF 文件中,這變爲 2, 00, 0, 7024。
“DestDir”是將要加載文件的目錄所在的位置:11 指定系統目錄爲 WINDOWS/SYSTEM 或 WINNT/SYSTEM32;10 指定 Windows 目錄、WINDOWS 或 WINNT。如果未指定任何 DestDir(典型情況),則代碼安裝在固定的 OCCACHE 目錄中。
“clsid”是將要安裝的控件的 CLSID。
創建了 INF 文件後,運行 CABARC 實用工具(可在 Mssdk/Bin 目錄中找到)以創建 CAB 文件。應在包含源文件的目錄下運行 CABARC。在命令行上,按源文件出現在 INF 中的順序排列它們,並將 INF 文件放在最後。例如,若要從上面的 INF 文件生成 Polygon 控件的 CAB 文件,請使用下面的命令:
C:/MSSDK/BIN/CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
POLYGON.CAB 文件包含一個 ATL.DLL 和 POLYGON.DLL 的壓縮版本,同時還含有在 POLYGON.INF 文件中將其解壓縮所需的信息。
有關如何分析及從 CAB 文件中解壓縮組件的示例,請參見 http://msdn.microsoft.com/visualc/downloads/samples.asp(選擇 CabView 鏈接)上 MSDN Online Code Center 中的 CabView 示例。
需要在 MFC 控件中包含的 DLL 文件有 MSVCRT.DLL、MFC42.DLL 和 OLEPRO32.DLL。
運行 CABARC 實用工具
可在 Mssdk/Bin 目錄中找到 CABARC 實用工具。例如:
C:/MSSDK/BIN/CABARC -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:/MSSDK/BIN/CABARC


淺析ActiveX控件的CAB壓縮
 
任鳳華
 
 
摘  要  本文簡單介紹了CAB壓縮,以及使用WinCAB將ActiveX控件壓縮爲CAB文件的具體步驟。
關鍵詞  ActiveX控件;CAB壓縮;WinCAB;INF文件
 
1. 引言
ActiveX控件技術是從OLE基礎上發展起來的,是將OLE進行了擴展從而使其適應Internet、Intranet、商業應用程序等的開發。當ActiveX控件的程序代碼在Internet上傳輸時,使用壓縮技術傳輸程序代碼變得非常有意義。
從另一方面來看,如果ActiveX控件還調用到其他的DLL程序模塊,那麼IE也必須把這些程序下載到本地來。爲此,Microsoft採用了慣用的CAB壓縮方法,它把ActiveX控件應用程序以及相關的其他文件放在同一個CAB文件中,然後在CODEBASE屬性中指定CAB文件的URL路徑。當IE找到CODEBASE屬性時,它會自動解析URL地址從而把CAB文件解壓到客戶機的臨時目錄,然後註冊有關文件,調用COM API函數創建ActiveX控件對象。這樣就完成了ActiveX控件的傳輸。
  
2. CAB壓縮技術簡介
微軟公司在發行Windows 95、Plus!95等軟件時採用了一種全新的CAB壓縮包形式,它具有壓縮率高、安全性好、不易受到破壞等優點,深受廣大用戶及軟件製作商的歡迎。許多用戶甚至因此希望將自己的數據文件改用CAB壓縮包的形式加以壓縮、備份,以儘可能的減少備份文件所佔用的磁盤空間,並提高它們的安全性。目前製作CAB文件的軟件有主要有Cabarc和WinCAB。
 Cabarc是一個用於壓縮、列出壓縮包中的文件、解壓CAB文件的工具。Cabarc支持通配符和遞歸路徑搜索。不過Cabarc使用一個類似於常用的壓縮工具的命令行界面,
並且有較多的參數,與現在主流的Windows操作系統不太協調,使用起來不是很方便。
而WinCAB是一種可視化的全新的CAB壓縮包製作軟件,它具有采用圖形界面、支持分卷壓縮、可製作具有自解包功能的CAB壓縮包(*.EXE文件格式)等優秀功能,這就從根本上解決了CAB壓縮包的製作問題。需要注意的是在運行WinCAB.exe時,必須確保makecab.exe文件也在相同的目錄下。
本文就以WinCAB爲例來介紹ActiveX控件的CAB文件的製作過程。
 
3. 將ActiveX控件壓縮成CAB文件
主要步驟有:
1)註冊YourCtl.ocx控件。
2)建立YourCtl.inf文件。
   INF文件的格式如下:(在使用Visual C++6.0的情況下)
   [version]
   signature="$CHICAGO$"
   AdvancedINF=2.0
[Add.Code]
   YourCtl.ocx=YourCtl.ocx
   mfc42.dll=mfc42.dll
   msvcrt.dll=msvcrt.dll
   olepro32.dll=olepro32.dll
[YourCtl.ocx]
   file-win32-x86=thiscab
   clsid={YourCtl.ocx的CLSID}  //在YourCtl.odl文件中可以找到
   FileVersion=1,0,0,1
   RegisterServer=yes
[msvcrt.dll]
   FileVersion=6,0,8168,0    
   hook=mfc42installer
[mfc42.dll]
   FileVersion=6,0,8168,0
   hook=mfc42installer
[olepro32.dll]
   FileVersion=5,0,4261,0
   hook=mfc42installer
[mfc42installer]
   file-win32-x86=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab
   run= % EXTRACT_DIR % /mfc42.exe
  
   這裏需要說明的是上述msvcrt.dll、mfc42.dll、olepro32.dll的FileVersion是根據VC不同的版本而異的,例如在VC5.0sp3中就應該如下
   olepro32.dll   5,0,4230,1
   mfc42.dll     4,21,0,7303
   msvcrt.dll     5,0,0,7303
    每個VC版本都有不同的版本號,這裏只介紹常見的兩種。 另外mfc42installer的下載路徑除了VC4.1和更早版本使用http://activex.microsoft.com/controls/vc/mfc40.cab外,其他版本都使用http://activex.microsoft.com/controls/vc/mfc42.cab
3)啓動WinCAB開始壓縮。(其中注意Makecab.exe要在WinCAB目錄下)
   i)啓動WinCAB,然後執行“Cabinet”菜單的“New”命令或單擊快捷工具欄上的“New cabinet”按鈕,準備製作新的CAB壓縮包。
 ii)單擊快捷工具欄上的“Add file(s) to cabinet”按鈕,打開“Add file(s) to cabinet”對話框。
iii)選擇欲添加到CAB壓縮包中的文件後單擊“打開”按鈕,將它們添加到WinCAB的文件列表中。這裏只需要添加YourCtl.ocx和YourCtl.inf兩個文件。
iv)在WinCAB快捷工具欄的“Cabinet path and name”框中輸入或利用“Browse for path and name”按鈕指定CAB壓縮包的路徑及文件名。
v)在“Cabinet size”欄中指定CAB壓縮包的尺寸。
vi)在“Compression method”框中選擇合適的壓縮方式。
vii)單擊“Save cabinet”按鈕,WinCAB即會按照用戶的要求進行壓縮。
viii)壓縮完成後,WinCAB會給出一個“WinCAB Report”的報告框,向廣大用戶報告有關文件個數、壓縮前後的文件尺寸、壓縮率、壓縮時間等情況。至此,一個CAB文件就生成了。
4. 結束語
  由於CAB的壓縮率比我們常用的ARJ、ZIP、RAR等壓縮包要高許多(約20%),從而進一步的減少了壓縮文件所佔用的磁盤空間,當採用該技術在Internet上傳輸ActiveX控件時既減少了網絡流量,也加快了網頁打開的速度。
另外,由於CAB壓縮包具有“只讀”屬性,在創建完成後即不允許再作任何修改、刪除,因此不易受到病毒、誤操作等問題的影響,安全性也具有保證,實爲廣大用戶在Windows 下進行文件的壓縮、備份工作時的最佳選擇。
注:**基金項目**,國家973計劃,(編號:G1998030600)。
關於證書和簽名     -|zuiwanting 發表於 2006-5-24 9:58:00 
 
/Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1/Bin下有關於證書和簽名相關工具
1。Makecert.exe ---證書創建工具
2。Cert2Spc.exe ---發行者證書測試工具
3。Signcode.exe ---文件簽名工具
建立自己的根證書:
makecert -sk myPK -ss myName -n "CN=LUO31工作室" -r c:/luo31.cer
      sk-表示主題的密鑰容器位置,ss-主題的證書存儲名稱, n-證書頒發對象,r-證書存儲位置;
如果你需要導出私鑰文件,請不要使用sk,而換作s,eg:makecert  -ss myName -n "CN=LUO31工作室" -sv c:/luo31.pvk  -r c:/luo31.cer
建立自根證書授權的子證書:
makecert -sk "myPK" -is myName -n "CN=luo31" -$ commercial -ic c:/luo31.cer  c:/31.cer
      sk-表示主題的密鑰容器位置,is-頒發者的證書存儲名稱, n-證書頒發對象,ic-頒發者的證書存儲位置,-$-授權範圍(用於代碼簽名);
使用Cert2Spc生成spc發行者證書(可選):
cert2spc c:/31.cer c:/31.spc
使用signcode爲你的程序,庫或cab包簽名:
雙擊signcode,或在控制檯鍵入signcode,不帶參數會啓動簽名嚮導。在第三步選擇“自定義選項”,第四步選擇“從文件選擇”選擇31.spc或31.cer,第五步選擇“CSP中的私鑰”,在密鑰容器中選擇我們定義的myPK,其他步驟默認即可,如果想添加時間戳,請在時間戳服務器地址上鍵入:(免費時間戳認證)http://timestamp.verisign.com/scripts/timstamp.dll ;
完成後,觀察你所簽名的文件屬性,應該已經添加數字簽名項 


3.  ActiveX控件在頁面上的引用

 

 <OBJECT id="axGraphOcxSCADA" style="Z-INDEX: 102; LEFT: 160px; WIDTH: 784px; POSITION: absolute; TOP: 80px; HEIGHT: 536px"
    codeBase="GraphOcx.CAB#version=1,0,0,3" classid="clsid:87186EA1-4D89-4F3E-9D25-1F03F0DDDB95"
    name="axGraphOcxSCADA" VIEWASTEXT>
    <PARAM NAME="_Version" VALUE="65536">
    <PARAM NAME="_ExtentX" VALUE="20743">
    <PARAM NAME="_ExtentY" VALUE="14182">
    <PARAM NAME="_StockProps" VALUE="0">
   </OBJECT> 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章