codefans

          導航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          程序設計鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          怎么發布使用了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的目錄

          posted on 2005-07-27 10:18 春雷的博客 閱讀(757) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 文化| 吴江市| 项城市| 甘孜县| 古浪县| 织金县| 高邑县| 全椒县| 宜兰县| 兖州市| 中西区| 九江县| 石柱| 阿城市| 会东县| 靖远县| 石河子市| 视频| 新密市| 龙口市| 松江区| 长泰县| 新绛县| 方正县| 祥云县| 平舆县| 平顺县| 太白县| 射洪县| 靖江市| 策勒县| 大冶市| 南皮县| 旬阳县| 唐山市| 泰和县| 十堰市| 惠来县| 台湾省| 四平市| 东兰县|