codefans

          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          程序設(shè)計(jì)鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          怎么發(fā)布使用了dll的Activex呢?

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

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 辉县市| 普兰店市| 贞丰县| 彭阳县| 玉树县| 辽中县| 湘阴县| 芦山县| 股票| 公安县| 延边| 瑞金市| 来凤县| 双柏县| 大竹县| 贵州省| 敦煌市| 梁河县| 乃东县| 慈利县| 鄂托克前旗| 白玉县| 建平县| 赤水市| 潞城市| 宝鸡市| 滨海县| 习水县| 秦皇岛市| 三亚市| 唐山市| 进贤县| 商洛市| 东乌珠穆沁旗| 东城区| 宿松县| 潍坊市| 新泰市| 黄冈市| 鹿邑县| 邳州市|