怎麼發布使用了dll的Activex呢?

來源:互聯網
上載者:User
 

怎麼發布使用了dll的Activex呢?

一個嵌入網頁的ActiveX,需要調用兩個dll檔案。我把它們打成CAB檔案後在用戶端無法註冊。但這個ocx本身是好的,如果將ocx和兩個dll檔案拷貝到用戶端,然後手動註冊就沒問題了。  
 
那怎麼發布使用了dll的Activex呢?  
---------------------------------------------------------------  
 
ZT:  
 
1、如果需要建立cab檔案,首先需要Cabarc或者Makecab,它們隨著Cabinet  SDK的安裝就有了,Cabinet  SDK的是http://msdn.microsoft.com/workshop/management/cab/cabdl.asp。  
Cabarc可以建立、查看或者解出cab裡面的檔案,而Makecab則只可以用來建立cab檔案。  
2、製作cab檔案時需要將所有的相關檔案都包含進去,可以通過Depends(VC內建的)檢查需要的檔案。使用inf檔案將這些東西都寫進去。  
3、inf搞法:inf檔案描述cab中所有的ocx及dll檔案,inf通過一些命名地區來提供需要的資訊。  
 
怎麼寫inf  
最開始一般是[Version]區:  
eg:  [Version]  
signature="$XXXX$"  
AdvancedINF=2.0  
接下來就是最重要的[Add.Code]區:  
eg:  [Add.Code]  
Ctrl1.dll=C1Section  
Ctrl2.dll=Ctrl2.dll  
前面是要下載的檔案名稱,後面是對應這個檔案的地區名,可以是任何名字,不過一般都是和檔案的名字相同,這樣方便維護。還有需要注意是在[Add.Code]區出現的檔案要根據依賴性進行排序,例如前面說的ctrl1.dll要依賴於ctrl2.dll,則ctrl2.dll要出現在ctrl1.dll的前面。因為安裝時是按照相反的順序進行的,也就是說先安裝ctrl2.dll,然後才是ctrl1.dll,哧哧,記清楚了,不要搞反了。  
再接下來是各個檔案的地區了  
[Ctrl1.dll]  
file-win32-x86=thiscab  
RegisterServer=yes  
clsid={.....}  
DestDir=
FileVersion=1,0,0,0  
[Ctrl1.dll]地區中的第一個file值告訴ie到哪裡去得到這個dll,file一共包括三個部分,第一部分是file,這個永遠都是這樣的(至少目前來說);第二部分告訴聲明支援的OS,win32表示windows,mac就是蘋果MAC  OX了;第三部分是CPU類型,比如說x86、  ppc  (Power  PC)、  mips或者alpha了。  
file的值可以取三個一個URL、ignore和thiscab,如果是URL則說明到URL所在的位置去下;如果是ignore說明對於這種OS和CPU,不需要下載這個檔案(ctrl1.dll);如果是thiscab很明顯就在當前的cab檔案中了。  
接下來是RegisterServer,可以取兩個值yes和no,如果為yes則說明ie要註冊該dll,如果是no就不必了;  
再下來是DestDir,它的值是dll將要存到本地硬碟的位置,如果它的值是10,則將dll放到/Windows或者/WinNT下;如果是11,則放到/Windows/System或者  
/WinNT/System32下;如果是空(就是沒有值)則會放到/Windows或者/WinNT下的Downloaded  Program  Files目錄下;  
最後是FileVersion,這個就比較明顯了,說明了ctrl1.dll的版本號碼。  
有時候我們使用VB來開發控制項的時候,需要將VB的虛擬機器裝上去,它需要一些其它的說明的,簡單地講一下吧:  
在[Add.Code]中增加一項MSVBVM60.DLL=MSVBVM60.DLL(以VB6為例)下面是  
MSVBVM60.DLL地區:  
[MSVBVM60.DLL]  
hook=MSVBVM60.cab_Installer  
FileVersion=6,0,81,76  
FileVersion很明顯,是版本號碼,就不再說發,就說說hook吧。  
hook地區是在安裝的時候需要執行的地區,它分為兩種,一種是有條件的,另外一種是無條件的,無條件的hook地區是必須執行的,反之則根據條件判斷是否執行。以[Setup  Hooks]標記的地區是無條件地區,如下所示  
[Setup  Hooks]  
hookname=section-name  
 
[section-name]  
run=%EXTRACT_DIR%/setup.exe  
無條件地區常用來通過一個inf檔案執行一個安裝程式,這就是我們在資源管理員右鍵點擊一個inf檔案時在執行安裝這樣的菜單的原因了  
當ie下載了一個cab檔案,如果檔案中沒有[Add.Code],則處理[Setup  Hooks]地區,運行run所指定程式,哧哧,上面就是setup.exe;  
條件地區則為在一定條件下執行,前面為MSVBVM60.DLL指定的hook地區就是一個條件地區,如果在MSVBVM60.DLL指定的CLSID或者version不能滿足需要而且沒有file這個命名值,則執行hook所指定的地區。  
[MSVBVM60.cab_Installer]  
file-win32-x86=http://activex.microsoft.com/controls/vb6/VBRun60.cab  
run=%EXTRACT_DIR%/VBRun60.exe  
上面[MSVBVM60.cab_Installer]是一個hook地區,它也包含了一個file值,指定一個URL,表示MSVBVM60.DLL可以從這個URL下載得到;run則說明了執行哪一個檔案  
這裡有必要說明一下的是,MS對一些常用的Redistributable  Microsoft  DLLs  
可以通過指定CODEBASE屬性為http://activex.microsoft.com/controls,這樣在cab檔案中就中需要包含這些檔案,在電腦上有一個檔案redist.txt上面的dll就是Redistributable  Microsoft  DLLs  
 
 
建立一個cab檔案:  
cabarc  N  ctrl1.cab  ctrl1.inf  ctrl1.dll  
N表示要建立一個新的檔案,ctrl1.cab是建立的檔案名稱,ctrl1.inf是cab的inf,後而是需要加到cab裡的檔案,可以使用萬用字元。  
然後就可以將cab檔案放到網頁上了  
<OBJECT  ID="Ctrl1Obj"  
CLASSID="clsid:....................................."  
CODEBASE="http://server.com/ctrl1.cab#version=8,0,0,5007">  
</OBJECT>  
這裡也在一個version,不過這裡的version是指控制項的version,而inf裡的是檔案的version。  
 
 
製作電子簽名:  
首先從下面的網址下載製作簽名的工具SignCode,地址是  
http://msdn.microsoft.com/workshop/gallery/tools/authenticode/authcode.asp  
從簽名授權中心如VeriSign或者你的區域網路上啟動並執行Microsoft  Certificate
Server授權伺服器得到一個certificate,在申請授權的過程你會得到一個私密金鑰。  
也可以使用MakeCert.exe和Cert2Spc.exe建立的私密金鑰進行測試,方法是首先使用MakeCert建立一個X.509的certificate(.cer檔案)  
MakeCert  -sv  MyKey.pvk  n  "CN=My  Software  Company"  MyCert.cer  
然後利用Cert2Spc將.cer檔案轉換成為PKCS  #7軟體發布Certificate(.spc檔案),  
Cert2Spc  MyCert.cer  MyCert.spc  
利用你下載的SignCode對你的cab檔案進行電子簽名  
SignCode  -spc  MyCert.spc  -v  MyKey.pvk  -t  http://  
timestamp.verisign.com/scripts/timstamp.dll  ctrl1.cab  
SignCode還可以指定一些其它的參數,就不說了,太長了,哧哧。  
雖然可以利用測試的.cer和.spc檔案,但是在發布的時候,必須申請。  
 
其實東西在SDK中都有說明,不過都是E文的,慢慢看就沒有什麼發  
---------------------------------------------------------------  
 
再補充一點,如果只是測試,你可以SignCode時斷行符號,根據提示一步步往下選,命令列參數又臭又長,還經常出錯,這樣會節省不少你的時間  
---------------------------------------------------------------  
 
這是因為ocx關聯了你的兩個dll,在系統調用ocx中的註冊函數是需要調用你的dll但系統無法找到,所以載入ocx失敗造成註冊失敗  
 
解決的辦法是在cab的安裝檔案裡把dll安裝到系統的目錄下,或者動態載入dll,或者指定載入dll的目錄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.