cab文件打包的ActiveX控件(轉)

程序環境:Windows Xp SP2, IE 6, Tomcat 6.0, VC++6.0javascript

    利用MFC開發的ActiveX控件要正常運行必須依賴MFC庫。可是你不能保證你用戶的機器上裝有與你開發環境相同的庫,因此,當你發行一個ActiveX控件,你必需要包證這些依賴庫的存在。html

    ActiveX控件作成ocx文件,用於客戶端調用本地程序,其中有用到VC中的幾個.dll文件。包成cab文件,在服務器端頁面進行控件調用,下載cab文件並自動註冊、使用。
ActiveX控件調用到其餘的DLL程序模塊,那麼IE也必須把這些程序下載到本地來。爲此,Microsoft採用了慣用的CAB壓縮方法,它把 ActiveX控件應用程序以及相關的其餘文件放在同一個CAB文件中,而後在CODEBASE屬性中指定CAB文件的URL路徑。 當IE找到CODEBASE屬性時,它會自動解析URL地址從而把CAB文件解壓到客戶機的臨時目錄,而後註冊有關文件,調用COM API函數建立ActiveX控件對象。這樣就完成了ActiveX控件的傳輸。
java

目前製做CAB 文件的軟件有主要有Cabarc和WinCAB。
Cabarc是一個用於壓縮、列出壓縮包中的文件、解壓CAB文件的工具。Cabarc支持通配符和遞歸路徑搜索。不過Cabarc使用一個相似於經常使用的壓縮工具的命令行界面,而且有較多的參數,與如今主流的Windows操做系統不太協調,使用起來不是很方便。
WinCAB 是一種可視化的全新的CAB壓縮包製做軟件,它具備採用圖形界面、支持分卷壓縮、可製做具備自解包功能的CAB壓縮包(*.EXE文件格式)等優秀功能, 這就從根本上解決了CAB壓縮包的製做問題。須要注意的是在運行WinCAB.exe時,必須確保makecab.exe文件也在相同的目錄下。
web


建立 INF 文件express

當用戶第一次瀏覽你控件所在的網頁時,它會自動提示控件下載,包括*.inf文本文件中涉及的OCX控件文件以及 DLL文件(控件依賴的MFC庫文件,ocx控件也是一種特殊的DLL),並自動註冊控件及庫文件,而後控件便可以正常使用。控件及庫文件只須要下載一 次,當客戶端上已有 MFC DLL 時,則不對它們進行下載(默認狀況下,版本號同用戶硬盤上的現有文件相同的文件不下載)。
INF 文件是一個文本文件,用以指定爲控件的運行而須要下載的文件(如 DLL 庫文件和 OCX 控件文件)。INF 文件說明都有哪些文件要捆綁在一個壓縮的 CAB 文件中。
XMS_Agent.inf文件內容以下:
安全

; Sample INF file for XMS_Agent.OCX
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
XMS_Agent.ocx=XMS_Agent.ocx
mfc42.dll=mfc42.dll
msvcrt.dll=msvcrt.dll
olepro32.dll=olepro32.dll
wsock32.dll=wsock32.dll
[XMS_Agent.ocx]
file-win32-x86=thiscab
clsid={997A9783-1815-4820-A2B9-DAB8F0332681}
FileVersion=1.0.0.1
RegisterServer=yes
服務器

; needed DLL
[msvcrt.dll]
file-win32-x86=thiscab
FileVersion=7.0.2600.2180     
DestDir=11
RegisterServer=yes
[mfc42.dll]
file-win32-x86=thiscab
FileVersion=6.2.4131.0
DestDir=11
RegisterServer=yes
[olepro32.dll]
file-win32-x86=thiscab
FileVersion=5.1.2600.3266
DestDir=11
RegisterServer=yes
[wsock32.dll]
file-win32-x86=thiscab
FileVersion=5.1.2600.2180
DestDir=11
RegisterServer=yes
; end of INF file
網絡

    「thiscab」是一個關鍵字,表示須要的文件在包含此INF文件的CAB包中。也可經過指定一個相對路徑,從一個 HTTP 位置下載所需的 DLL,例如:app

    file-win32-x86=http://你的網站地址/NEEDED.DLLwebapp

    關鍵字「file-win32-x86」將平臺標識爲 x86。

    FileVersion指文件版本號。能夠經過在 Windows 資源管理器中的文件上單擊鼠標右鍵來獲取文件的版本號。
從顯示的列表中選擇「屬性」,而後在顯示的對話框中選擇「版本」選項卡。
有時須要在文件版本中額外插入一個 0,例如,在對話框中 ATL.DLL 的版本號若是顯示爲 2.00.7026。而在 INF 文件中,須要變爲 2, 00, 0, 7026。

    控件的文件版本能夠經過 Visual Studio 的版本資源得到。
從文件菜單中,選擇打開,而後單擊打開爲(Open as): 資源,打開控件OCX文件;所需的文件版本就在 FILEVERSION 後面列出。

    「DestDir」是文件要下載到的目錄位置:11 指定系統目錄 WINDOWS/SYSTEM 或 WINNT/SYSTEM32;
10 指定 Windows或WINNT目錄。
若是未指定任何 DestDir(典型狀況),則代碼安裝在固定的 OCCACHE臨時目錄中。 
「clsid」是將要安裝的控件的 CLSID。

下邊是個在網上發佈控件,在微軟網站下載mfc42.cab的例子:

[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


打包文件

  • 使用Cabarc:
    下載 Cabinet 軟件開發工具包(也稱爲 Cabinet SDK 或 CAB 開發工具包),解壓縮後能夠找到構造 CAB (.cab) 文件所需的工具CABARC.EXE文件。
    Cabinet 軟件包下載地址請參見如下 Microsoft 網站:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncabsdk/html/cabdl.asp

    把控件文件、庫文件(vc6.0MFC庫文件包括mfc42.dll、msvcrt.dll、olepro32.dll、wsock32.dll)、打包 命令文件CABARC.EXE,以及控制 ActiveX 控件安裝的 .inf 文件放在同一目錄下,運行如下DOS命令打包控件:

cabarc.exe -s 6144 N XMS_Agent.cab XMS_Agent.ocx XMS_Agent.inf mfc42.dll msvcrt.dll olepro32.dll wsock32.dll

  • 使用WinCAB:(其中注意Makecab.exe要在WinCAB目錄下)
    啓動WinCAB,而後執行「Cabinet」菜單的「New」命令或單擊快捷工具欄上的「New cabinet」按鈕,準備製做新的CAB壓縮包。
    單擊快捷工具欄上的「Add file(s) to cabinet」按鈕,打開「Add file(s) to cabinet」對話框。
    選擇欲添加到CAB壓縮包中的文件後單擊「打開」按鈕,將它們添加到WinCAB的文件列表中。這裏只須要添加YourCtl.ocx和YourCtl.inf以及所需dll文件。
    在WinCAB快捷工具欄的「Cabinet path and name」框中輸入或利用「Browse for path and name」按鈕指定CAB壓縮包的路徑及文件名。
    在「Cabinet size」欄中指定CAB壓縮包的尺寸。
    在「Compression method」框中選擇合適的壓縮方式。
    單擊「Save cabinet」按鈕,WinCAB即會按照用戶的要求進行壓縮。
    壓縮完成後,WinCAB會給出一個「WinCAB Report」的報告框,向廣大用戶報告有關文件個數、壓縮先後的文件尺寸、壓縮率、壓縮時間等狀況。至此,一個CAB文件就生成了。
  • 使用\WINDOWS\system32\iexpress.exe:(在網上看見的,沒用過)
    選擇「Create new Self Extraction Directive file」,點擊下一步。
    選擇「Create compressed files only(ActiveX Installs)」,點擊下一步。
    點擊Add,文件添加(XMS_Agent.ocx、XMS_Agent.inf、mfc42.dll、msvcrt.dll、olepro32.dll、wsock32.dll),點擊下一步。
    點擊Browse,輸入.CAB文件的存放地址(包含所取文件名),這裏取XMS_Agent.CAB,而且要選中 「Store files using Long File Name inside Package」。點擊下一步。
    選擇「Don’t save」,一直點擊下一步,直到完成。

因爲CAB的壓縮率比咱們經常使用的ARJ、ZIP、RAR等壓縮包要高許多(約20%),從而進一步的減小了壓縮文件所佔用的磁盤空間,當採用該技術在Internet上傳輸ActiveX控件時既減小了網絡流量,也加快了網頁打開的速度。
另外,因爲CAB壓縮包具備「只讀」屬性,在建立完成後即不容許再做任何修改、刪除,所以不易受到病毒、誤操做等問題的影響,安全性也具備保證,實爲廣大用戶在Windows 下進行文件的壓縮、備份工做時的最佳選擇。
注:**基金項目**,國家973計劃,(編號:G1998030600)。


關於證書和簽名

這部分沒涉及到……,也不知道真正的用意,下邊是抄襲過來的,有待之後的理解。

傳說中數字簽名以後就能夠不出現提示而自動下載:
\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin下有關於證書和簽名相關工具

Makecert.exe ---證書建立工具
Cert2Spc.exe ---發行者證書測試工具
Signcode.exe ---文件簽名工具

創建本身的根證書:
步驟:
1)        makecert -ss name -n "CN=公司名" -sv d:\pos.pvk -r d:\pos.cer 
其中sk-表示主題的密鑰容器位置,ss-主題的證書存儲名稱, n-證書頒發對象,r-證書存儲位置,-sv 導出私鑰文件(爲了簽名使用)。
注意:這個時候會讓輸入三次密碼,三次要徹底一致。
2)        使用Cert2Spc生成spc發行者證書(可選):
cert2spc d:\pos.cer c:\pos.spc
3)        雙擊signcode,不帶參數會啓動簽名嚮導。先選擇要簽名文件,下一步,選擇「自定義」,下一步,選擇「從文件選擇」,添加剛生成的pos.cer證 書,下一步,選擇剛生成的私鑰pos.pvk,再下一步,可spc證書,再一直下一步。添加時間戳,在時間戳填入http: //timestamp.verisign.com/scripts/timstamp.dll,再下一步完成。

這樣就對CAB文件進行了簽名,可是這個時候點擊這個文件會發現證書不可用,緣由是證書沒有安轉。文件屬性->數字證書->詳細信息-〉查看證書-〉安裝證書,進入安裝證書嚮導,存放區域選擇「受信任的根證書頒發機構」,點擊完成便可。


建立包含控件的網頁

貼入測試頁面代碼:

<HTML>
<HEAD>
<TITLE>socket_ocx</TITLE>

<script type="text/javascript">
OpenSocket();
</script>

</HEAD>
<BODY >

<!-- 事件 -->
<script language="javascript" event="etEventCallin(recvstr,mainId)" for="KeygoeOcx">

if(RecvText.innerText=="")
{
RecvText.innerText="Event:<etEventCallin> "+"來電號碼:<"recvstr+"> "+"MainID:<"+mainId+">";
}
else
{
RecvText.innerText=RecvText.innerText+"\n"+"Event:<etEventCallin> "+"來電號碼:<"recvstr+"> "+"MainID:<"+mainId+">";
}

</script>

<!-- 方法 -->
<script language="javascript">

var strIP = "192.168.1.19"; // SOCKET服務端IP地址
var nWorkID = 101;    // 工號

// 打開Socket鏈接
function OpenSocket(){
KeygoeOcx.etOpenEx(strIP);
}
// 關閉Socket鏈接
function CloseSocket(){
KeygoeOcx.etClose();
}
// 簽入
function Login(){
KeygoeOcx.etLogin(nWorkID);
}

// 簽出
function Logout(){
KeygoeOcx.etLogout();
}

</script>

<!-- 加載 -->
<OBJECT width="0" height="0" ID="KeygoeOcx" WIDTH=100 HEIGHT=51
codebase="
http://192.168.1.19:8080/XMS_Agent.cab#Version=1,0,0,1"
CLASSID="CLSID:997A9783-1815-4820-A2B9-DAB8F0332681">
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="2646">
<PARAM NAME="_ExtentY" VALUE="1323">
<PARAM NAME="_StockProps" VALUE="0">
</OBJECT>

<!-- 界面 -->
接收內容:<br>
<textarea id=RecvText cols=50 rows=5 ></textarea>
<br>
<button id="btnOpenSocket" onclick="OpenSocket()">打開Socket鏈接</button>
<button id="btnCloseSocket" onclick="CloseSocket()">關閉Socket鏈接</button>
<br>
<button id="btnOpenSocket" onclick="Login()">簽入</button>
<button id="btnOpenSocket" onclick="Logout()">簽出</button>
<br>

</BODY>
</HTML>

注:若是本機使用能夠codebase="http://localhost/testactivex/XMS_Agent.cab#Version=1,0,0,001"
testactivex爲在本地機建立的虛擬目錄。
發佈XMS_Agent.cab文件,把cab文件放在Tomcat的Webapps\ROOT\下仍是Tomcat\webapps下該調用所在的工程下??啓動Tomcat。


測試控件下載和運行

應該在Internet選項-〉安全-〉受信任的站點-〉站點 中添加服務器地址。注意:不要選複選框「對該區域中的全部站點要求服務器驗證」。
等待對方答覆是否好使中....


二:
發佈ActiveX控件(把ocx作成cab發佈) --activex數字簽名
2009-08-13 15:16

最 近我正在研究ActiveX技術。我使用Delphi 7建立了一個具備ActiveForm的ActiveX控件應用程序。這個控件產生一個.OCX文件。如今,我須要把這個控件部署在服務器端,在用戶瀏覽 網頁並選擇安裝這個控件的時候,用戶的IE纔會下載、安裝並顯示這個控件。

可是個人控件必須做數字簽名之後,IE纔會下載安裝。問題是如何給ActiveX控件做數字簽名呢?現將具體步驟與你們分享。

首先我須要一套作數字簽名的工具。若是你沒有,能夠到如下地址下載:

http://www.cnblogs.com/Files/babyt/SignTool.rar

控件的名字是CustForm.ocx。首先,咱們須要建立一個.CAB文件用來把全部須要發佈的文件壓縮在一塊兒。咱們須要一塊兒發佈的文件是 CustForm.lic文件。它是Delphi在咱們建立控件工程的時候爲咱們生成的。若是不發佈這個文件,你的控件即便下載安裝成功,IE也沒法顯示 它。爲了在一個.CAB文件中發佈多個文件,咱們必須先建立一個.INF文件。一個.INF文件能夠告訴IE,它須要下載的文件和在哪裏能夠獲得這些文 件。

1. 建立.INF文件

建立一個.INF文件很簡單,用記事本程序編寫就能夠了。咱們把咱們的.INF文件取名爲GMTestX.inf。由於咱們要在.CAB文件中放入GMTest.ocx和GMTest.lic這兩個文件,因此咱們的.INF文件的內容以下:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
CustForm.ocx=CustForm.ocx
CustForm.lic=CustForm.lic //若是建立Active Form時沒有選擇Make Conctrol Lincensed 則不會產生.lic文件,那麼建立.inf文件時可去掉此行
[CustForm.ocx]
file-win32-x86=thiscab
clsid={C504DF79-C5EC-4314-AC3E-1F770DB81A01}
FileVersion=1,0,0,0
RegisterServer=yes
[CustForm.lic]//若是建立Active Form時沒有選擇Make Conctrol Lincensed 則不會產生.lic文件,那麼建立.inf文件時可去掉此行
file-win32-x86=thiscab//若是建立Active Form時沒有選擇Make Conctrol Lincensed 則不會產生.lic文件,那麼建立.inf文件時可去掉此行
FileVersion=1,0,0,0//若是建立Active Form時沒有選擇Make Conctrol Lincensed 則不會產生.lic文件,那麼建立.inf文件時可去掉此行

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在這個.INF文件的[version]部分有兩句代碼。signature="$CHICAGO$"表示這個.INF文件和Windows95或其後版 本和Windows NT 4.0或其後的版本兼容。AdvancedINF=2.0表示Advpack.dll的版本,IE 4.0或其後版本必須導入這個文件去解析這個.INF文件。在這裏要求的版本是2.0。

至於[Add.Code]部分,其中列出了在一個.CAB文件中須要下載的文件,並把這些文件的詳細信息映射到其後對應的各個部分。好比[CustForm.ocx]部分中的信息就是下載CustForm.ocx這個文件的相關信息。

在[CustForm.ocx]部分的第一句代碼告訴IE,CustForm.ocx文件就包含在這個.CAB文件中。第二行註明了這個控件的CLSID 號。第三行是控件的版本號。第四行告訴IE須要使用前面的CLSID號來註冊這個控件。[CustForm.lic]部分就很少講了。

2. 建立.CAB文件

在命令行中輸入如下代碼把CustForm.ocx、CustForm.inf和CustForm.lic這三個文件添加到一個.CAB文件中,這個文件取名爲CustForm.cab:

cabarc.exe -s 6144 N CustForm.cab CustForm.ocx CustForm.inf CustForm.lic

3. 建立證書文件

在命令行輸入如下命令:

makecert -sv CustForm.pvk -r -n "CN=SunStar" CustForm.cer

4. 轉換證書:

cert2spc CustForm.cer CustForm.spc

5. 建立另一個自簽名證書,叫test.cer

在命令行中依次輸入如下兩條命令:

makecert -sv test.pvk -r -n "CN=SunStar" test.cer

cert2spc test.cer test.spc

6. 從test.cer建立test.ctl文件

makectl test.cer test.ctl

7. 用CustForm.pvk和CustForm.spc這兩個文件給test.ctl做數字簽名

signcode -v CustForm.pvk -spc CustForm.spc test.ctl

8. 把test.ctl移動到受信系統存儲區

certmgr -add -ctl test.ctl -s trust

9. 把CustForm.cer移動到根系統存儲區

certmgr -add -c GMTestX.cer -s root

10. 用test.pvk和test.spc給CustForm.cab做數字簽名

singcode -v test.pvk -spc test.spc CustForm.cab

11. 檢查文件是否經過驗證

chktrust CustForm.cab

若是文件經過了數字簽名檢測,系統會詢問是否安裝這個文件,這時候必定要選擇安裝,整個簽名過程才能完成。

執行以上步驟的過程當中,有時候須要用戶輸入密碼。用戶能夠任意選擇一個密碼,好比12345。

接下來,咱們把一個調用Delphi的Web Deploy命令產生的文件CustForm.htm複製到C:\Inetpub\wwwroot\OurHTML文件夾中,並修改其內容以下:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<HTML>
<H1> 羣組配置 </H1><p>
<HR><center><P>
<OBJECT
id =CustForm 
classid="clsid:7E302B32-912F-427B-98D0-03AB15716E81"
codebase="/OurCAB/CustFormX.cab#version=1,0,0,0"
width=100%
height=80%
align=center
hspace=0
vspace=0

<param   name=Invaild         value=Invaild> 
<param   name=wsroot          value=http://192.168.0.56:8080/adms/services/> <!--value={TMPL,OUTPUT,COND}--> 
>
</OBJECT>
</HTML>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
再將簽名的CustForm.cab文件移動到C:\Inetpub\wwwroot\OurCAB文件夾中。

好了,如今打開IE,在地址欄中輸入:http://localhost/OurHTML/CustForm.htm後,IE詢問是否下載這個控件,咱們選擇是,就能夠看到咱們的ActiveX控件的窗體了。大功告成!


三:將下面語句包含在build.bat中
makecab HqForm.ocx ocx\HqForm.cab
相關文章
相關標籤/搜索