技巧 9、如何更新被鎖定的DLL
如果你正在使用Visual Basic COM組件,一定知道更新群組件版本時候所出現的錯誤資訊“不能更新DLL檔案,訪問禁止”,或許已經有好多次被它擋駕了。下面我們介紹的是一個小巧的批命令檔案,你可以用它來自動啟動或關閉鎖定DLL檔案的MTS。
問:
我們所用的IIS 4.0上運行著ASP和一個Visual Basic 6.0 DLL檔案,DLL檔案用來為ASP頁面提供資料服務。問題是,當我們想要把Web伺服器上的DLL升級到新的版本時,系統總是顯示DLL檔案正在使用中,既不能上傳也不能註冊這個新的DLL。我們試過關閉Web網站以及IIS,但DLL檔案仍處於使用狀態。唯一的辦法似乎是關閉伺服器。如你所知,網站運行時關閉伺服器顯然不太合適。你是否有解決這個問題的方法?有一個16位的工具軟體WPS可以關閉DLL,然而,它不能用於VB6的DLL檔案。
答:
不能更新DLL檔案的原因在於Microsoft Transaction Server(MTS)已經開啟了DLL的一個執行個體,必須使用mtxstop才能關閉它。首先,建立批命令檔案FlushCache.bat,在檔案中輸入以下內容:
net stop iisadmin /y
mtxstop
net start w3svc
運行這個批命令檔案。它將在大約5秒鐘內關閉Web伺服器並重新啟動它。在關閉和啟動兩個操作之間它將清除MTS緩衝,然後你就可以更新DLL檔案。
第一次運行批命令檔案的時候,要注意一下其他被關閉的服務(例如FTP服務等)。寫下這些被關閉的服務,然後開啟批命令檔案,加入代碼使得這些服務也被重新啟動:
net start < 服務的名字 >
2000年06月03日,Bill Bassett提出了另外一種方法:
有一種解決該問題的更為簡單的方法,這就是配置應用使其運行在自己獨立的記憶體空間中。運行IIS MMC,右擊包含目標應用的分支,選擇“屬性”。在屬性對話方塊中間的應用設定區,輸入應用的名字並選中“在獨立的記憶體空間運行”檢查框。
應用啟動並執行時候,只要再次開啟其屬性頁面就可以看到此時“卸載”按鈕已經變為可用了。點擊這個按鈕應用卸載,你可以更新DLL檔案。該操作並不取消DLL的註冊,所以這些工作要用regsvr32手工完成。這種方法要比關閉IIS等服務再重新啟動它們要好。
10、記錄檔案下載日誌
這是一個簡單但很實用的技巧,用於監測有多少使用者從網站下載了檔案。
問:
我們需要監測使用者在網站上的檔案下載操作。當使用者點選連結下載檔案時,我們希望能夠運行某個ASP檔案將日誌資料寫入SQL Server資料庫,然後執行下載操作。問題是,ASP頁面如何才能在記錄日誌資料之後再將檔案下載到用戶端?
答:
竅門在於用超級連結啟動第二個“後台”指令碼,用它來記錄下載日誌並啟動下載過程。只要第二個頁面不產生任何HTML輸出,使用者瀏覽器將仍舊顯示第一個頁面。
下面是第一個檔案中的連結樣本:
Download code.zip (不要點擊這個連結,它只用於示範,沒有任何實際功能。)
以上連結由下面的代碼建立:
< A HREF="dnladd.asp?filename=code.zip" >Download code.zip< /A >
使用者點選連結時我們把待下載的檔案名稱傳遞給了第二個檔案dnladd.asp。Dnladd.asp包含了把下載檔案名稱字和其他資訊寫入資料庫的指令碼。完成資料庫操作後,dnladd.asp用如下代碼啟動下載過程:
Response.ContentType = "application/x-zip-compressed"
Response.Redirect request("filename")
注意:不要在dnladd.asp中輸出任何HTML代碼。