如何在 Internet Explorer 中使用 .inf 檔案下載相依的 DLL

文章翻譯 文章翻譯
文章編號: 165075 - 檢視此文章適用的產品。
本文曾發行於 CHT165075
全部展開 | 全部摺疊

結論

您常常需要隨著 ActiveX 控制項一起下載相依的 DLL。MFC 與 Visual Basic 控制項都有此需求。本文將說明三種可以執行這項操作的方法。

其他相關資訊

有三種方法可以在下載控制項時加入相依的 DLL。第一種方法是將 DLL 和 OCX 以及 INF 檔案一起加入控制項的 CAB 檔案中。這種方法的缺點是,只要下載控制項,DLL 就會跟著下載。這種方法很適合某些情況。第二種方法是將相依的 DLL 封裝在個別的 CAB 檔案中,然後在控制項的 INF 檔案中參照至該檔案。第三種方法也是將 DLL 封裝在個別的 CAB 檔案中,但在控制項的 INF 檔案中使用勾點參照至 CAB 檔案。使用勾點可讓下載程序執行包含在相依 CAB 檔案中的 INF 或 EXE 檔案。

如果要為 OCX 新增相依性 (在這個範例中為 Simpdll.dll),請在 INF 檔案的 [AddCode] 區段中加入一個類似控制項區段的區段:
   [Add.Code]
   TestDw.ocx=TestDw.ocx
   simpdll.dll=simpdll.dll
				
然後,在 INF 檔案中加入一個區段來控制 DLL 的安裝:
   [simpdll.dll]
   FileVersion=1,0,0,1
   file-win32-x86=thiscab
				
這是上面內容所提到要將 DLL 相依性加入下載中的第一種方法。

如果要將 DLL 加入個別的 CAB 檔案中,只需要將位置從「thiscab」變更為要放置相依 CAB 的 URL:
file-win32-x86=DS V - Internet Client (僅限開發人員問題)
在此情況中,Simpdll.cab 只會包含 simpdll.dll。

如有需要,可以將多個 DLL 加入上述的 INF 和 CAB 檔案中。

第三種封裝相依 DLL 的方法是,使用勾點參照至相依 DLL 的 CAB 檔案。利用這種技術,即可在下載時執行相依 CAB 中的 INF 或 EXE 檔案。

.inf 檔案中的下列區段可以控制 MFC 控制項的相依 DLL 下載:
   [Add.Code]
   ...
   msvcrt.dll=msvcrt.dll
   mfc42.dll=mfc42.dll
   olepro32.dll=olepro32.dll

   [msvcrt.dll]
   FileVersion=4,20,0,6164
   hook=mfc42installer

   ...

   [mfc42installer]
   file-win32-x86=http://activex.microsoft.com/controls/vc/mfc42.cab
   run=%EXTRACT_DIR%\mfc42.exe
				
在此情況中,MFC DLL 是封裝在一個自我解壓縮的 .exe 檔案中,該檔案包含在 .cab 檔 (mfc42.cab) 中。然而,Microsoft 目前並未提供建立自我解壓縮 .exe 檔案的工具。因此,您需要使用 .inf 檔案來封裝相依的 DLL,或是在安裝勾點中參照此 .inf 檔案:
   [yourinstaller]
   file-win32-x86=http://example.microsoft.com/simpdll.cab
   InfFile=your.inf
				
或者,您需要使用協力廠商工具來建置自我解壓縮 EXE 檔案。

為了示範說明,下列是用來安裝相依 MFC DLL 的 .inf 檔案。您可以修改此檔案,以安裝 MFC DLL 的相同方式來安裝自己的 DLL。
   ; ========================= Mfc42.inf =========================

   ; This file will control the download of the MFC 4.2 DLLs

   [version]
   ; version signature (same for both NT and Win95) do not remove
   signature="$CHICAGO$"
   AdvancedINF=2.0

   [SourceDisksNames]
   ; This section specifies that all sources are in the "default"
   ; location.
   1="default",,1

   [DefaultInstall]
   ; Default section to process and copy all files under the section
   ; mfcdllsx.files and Register DLLs under the section mfcdllsx.register.
   CopyFiles=mfcdllsx.files
   RegisterOCXs=mfcdllsx.register

   [DestinationDirs]
   ; Destination Directories for CopyFiles Sections.
   ; 11 indicates LDID_SYS - system directory
   mfcdllsx.files=11

   [mfcdllsx.files]
   ; ,,,32 - Suppress version conflict dialog and don't overwrite newer
   ; DLLs
   msvcrt.dll,,,32
   mfc42.dll,,,32
   olepro32.dll,,,32

   [mfcdllsx.register]
   ; msvcrt.dll is not self registering
   %11%\mfc42.dll
   %11%\olepro32.dll

   ; ====================== Mfc42.inf ======================
				
如果 DLL 匯出 DllRegisterServer 函數,則必須將它列在 .register 區段中。使用 Visual C 編譯器的 Dumpbin.exe 公用程式,即可以檢查 DLL 以便進行判斷。您也可以在 DLL 上執行 Regsvr32,它會嘗試登錄此 DLL。Regsvr32 會載入 DLL,並藉由在 DLLRegisterServer 函數上呼叫 GetProcAddress() 來確認是否已正確匯出 DllRegisterServer。如果成功,表示已經匯出並呼叫 DllRegisterServer 函數。

然而,請注意,在 DLL 上執行 Regsvr32 可能會產生不良的影響。當呼叫 DllRegisterServer 時,它會建立適當的登錄項目,指向 DLL 在電腦上的位置。例如,在 MS-DOS 命令提示字元中輸入下列命令以進行測試,可能會造成問題:
   copy mfc42.dll C:\Test
   run "D:\msdev\bin\REGSVR32.EXE C:\Test\mfc42.dll"
   delete mfc42.dll
				
下次系統嘗試尋找 Mfc42.dll 時,會查看登錄,然後發現此檔案對應至 C:\Test\Mfc42.dll,但在該處卻找不到它。在已安裝於電腦的檔案上執行 Regsvr32,並不會造成問題。

使用勾點和自我解壓縮 EXE 來安裝 DLL 很有用,因為:如果需要升級的 DLL 已經載入記憶體中,下載就會失敗。這是已知的問題,Internet Explorer 4.0 版已經修正了此問題。Internet Explorer 4.0 會建議您重新開機並在重新開機期間載入新的 DLL。

?考

如需詳細資訊,請參閱「Microsoft 知識庫」中的下列文件:
167158 HOWTO:封裝 MFC 控制項透過 Internet 供人使用
167597 SAMPLE: GetVers.exe Specifies Component FileVersion and #Version

如需詳細資訊,請參閱下列網路廣播:
How Does Internet Component Download Work?

屬性

文章編號: 165075 - 上次校閱: 2007年1月23日 - 版次: 2.4
這篇文章中的資訊適用於:
  • Microsoft Internet Explorer 3.0
  • Microsoft Internet Explorer 3.01
  • Microsoft Internet Explorer 3.02
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.5
關鍵字:?
kbcode kbdownload kbfaq kbhowto KB165075
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com