亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

[InstallShield] 卸載相關問題

系統 1924 0

說明] 本文由 piggybank 花費了一定的心血編寫,所以轉載或引用時務必注明來源,保證本說明及原文完整性。

如果需要在報刊轉載,請與我聯系 ,謝謝!

原文刊載在: http://blog.xiaozhu.com/play/

--------------------------------------------------------------------------------

在后面的內容中,主要解答以下幾個經常有朋友問到,卻又往往得不到很好的解決的問題:

如何創建卸載快捷方式?
為什么卸載的時候不執行 OnMaintUIBefore 和 OnMaintUIAfter?
為什么卸載的時候不執行 OnUnInstall?
為什么卸載的時候并沒有調用 OnMaintUIBeforeXXXX 或者 OnUnInstall,甚至連 OnBegin、OnAppSearch、OnShowUI 等等事件處理函數都沒有調用?
為什么第二次運行安裝程序的時候毫無提示就卸載了以前的版本并沒有調用 OnMaintUIBeforeXXXX 或者 OnUnInstall?

--------------------------------------------------------------------------------

關于如何創建卸載快捷方式的問題,請參考:〈InstallShield: Creating Uninstallation Shortcut 創建卸載快捷方式〉一文

請記住那個表格。在腳本中創建卸載快捷方式最好的方法就是用用于定義常量 UNINSTALL_STRING 提供的值。而在 IS操作界面中創建卸載快捷方式最好參考幫助中(參考該文)表格的方法,根據不同的項目類型采用不同的方法。如果用 IS提供的方便功能創建的卸載快捷方式有些毛病,最好改改——至于原因,在后面會提到。

--------------------------------------------------------------------------------

為什么卸載的時候不執行 OnMaintUIBefore 和 OnMaintUIAfter?
為什么卸載的時候不執行 OnUnInstall ?
在General Information -> Project Properties 你能看到:Enable Maintenance這一選項。如果設置為 Yes,那么當用戶在一臺已經安裝了該軟件的計算機上再次運行安裝程序,則會自動運行 OnMaintUIBefore 和OnMaintUIAfter 事件處理函數中的腳本。如果設置為 No,那就會調用 UnInstall 事件處理函數的腳本。

那么,如果卸載的時候不執行這兩個事件處理函數的腳本,就要檢查一下這一設置了。

但(呵呵,這里有個“但”),卸載的時候也可能不運行這兩個函數以及 OnUnInstall,耐心看下去吧。

--------------------------------------------------------------------------------

為什么卸載的時候并沒有調用 OnMaintUIBeforeXXXX 或者 OnUnInstall,甚至連 OnBegin、OnAppSearch、OnShowUI 等等事件處理函數都沒有調用?
1、安裝程序如果運行在“安靜”模式下,則不會執行這些事件處理腳本。

比如 setup.exe /s 或者 IDriver.exe /M{Product Code} /uninst 這樣的調用(請參考:〈InstallShield: Creating Uninstallation Shortcut 創建卸載快捷方式〉一文)。

2、如果不是在“安靜模式”,用戶在控制面板的 添加刪除程序 中,直接點了列在程序項后面的“刪除”而不是“更改”,則會運行在 REMOVEONLY 模式下。此時不出現維護界面,但并不是沒有執行相應腳本。

假如 Enable Maintenance 的設置為 Yes,按照上面的說法,顯然應該執行 OnMaintUIBefore 事件處理函數的腳本,但因為其默認代碼如圖:


所以不會調用 SdWelcomeMaint ,也就不會出現維護界面。所以容易錯以為 OnMaintUIBefore 沒有效果。
我們來看看“添加刪除程序”的按鈕和設置的關系:

其設置結果如圖:



3、不同的方法創建的卸載快捷方式也可能導致卸載過程不執行任何腳本。

最近一次為 xzSQLDeploy 制作安裝程序(請參考〈InstallShield Example: 演示 xzSQLDeploy 和xzIISConfig 腳本的使用〉一文提供的 InstallShield X 制作的范例),我采用了 IS提供的快捷功能來創建卸載快捷方式:在 Project Assistant 方式下的 Application Shortcuts這一步執行左邊的 Create an Unstallation Shortcut(請參考〈InstallShield: CreatingUninstallation Shortcut 創建卸載快捷方式〉一文) :
結果對比發現該快捷方式采用的是 MSIExec.exe 的 /x 參數來進行卸載——于是卸載不是運行在 IS 下,沒有調用 IS 的事件處理函數的腳本。

所以,如果使用 IS 提供的快捷功能創建快捷方式,記著檢查其 Target。如果需要在卸載的時候執行一些特別的動作(比如在你的腳本刪除某些文件、刪除創建的 IIS 站點等等),那就改為(這里的“7”根據對應的IS版本改為8、9、10):

(請參考〈InstallShield: Creating Uninstallation Shortcut 創建卸載快捷方式〉一文)

[CommonFilesFolder]InstallShield/Driver/7/Intel 32/IDriver.exe

連同參數,在目標計算機上就等同于

"%SystemDrive%/Program Files/Common Files/InstallShield/Driver/10/Intel 32/IDriver.exe" /M{你的產品的 Product Code}
如果你按照上面說的方法采用 UNINSTALL_STRING,并調試輸出其值,你會發現它就是上面的內容 ^oo^



--------------------------------------------------------------------------------

為什么第二次運行安裝程序的時候毫無提示就卸載了以前的版本并沒有調用 OnMaintUIBeforeXXXX 或者 OnUnInstall?
注意下圖:


在 Tools 菜單中選擇 Options,在彈出窗口的 Preferences 這一頁去掉對 "Uninstall before installing" 的選中,重新編譯并運行。

如果 Enable Maintenance 的設置為 Yes,執行 Setup.exe 完成安裝,然后再次執行 Setup.exe 就會出現下圖所示的維護界面:


如果 Enable Maintenance 的設置為 No,則執行 OnUninstall 事件處理函數的腳本。如果不想出現那個討厭的提示框,那你愛怎么改就怎么改了 ^oo^

Feedback
# XiaoZhu.com: [InstallShield] 卸載相關問題 2004-10-24 12:35 piggybank
Ping Back來自:blog.csdn.net

# re: [InstallShield] 卸載相關問題 2004-10-27 10:19 pk
piggybank,請教兩個問題。
1.用installshield X,能在腳本里遠程調用另外一臺機器里的可執行程序嗎?我用LaunchAppAndWait()試過,不行。
2.安裝程序如何要實現以下功能:先往被安裝機器里拷貝一些文件,修改注冊表,重新啟動機器,然后執行先前剛拷到機器里的一個可執行程序。
謝謝!

# re: [InstallShield] 卸載相關問題 2004-10-27 11:07 piggybank
pk,不用客氣

1、InstallShield 中涉及到 LaunchAppAndWait 等不支持網絡資源訪問。但是可以測試一下先把網絡資源映射為本地硬盤,應該是可以的。

2、啟動時運行,一般都是在注冊表的 Run、RunOnce 或者啟動組方一個快捷方式來實現的。
比如:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnce
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunServices
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunServicesOnce

InstallShield 自己也支持安裝過程中中途重新啟動,下次繼續。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnce
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Session Manager/FileRenameOperations
比如 IS 會監視在安裝過程中上述注冊表位置下的項是否發生變化,如果發生變化表明需要重新啟動。
當然,在你的需求里只要把你要運行的程序的快捷方式放到快捷組里就足夠了。

# re: [InstallShield] 卸載相關問題 2004-10-28 10:48 pk
piggybank,謝謝你的答復!

怪我自己,昨天沒把情況講清楚。

其實我現在遇到的問題是:
剛剛完成了一個JSP作的信息管理系統,B/S的。數據庫用的是ORACLE9i,OS是windows2000server,我本來按照以往的方法作好了一個在數據庫服務器本地執行的數據庫安裝和初始化程序SRVINST,包括創建用戶、建表等等。是由批處理命令和SQL文件組成的,功能和你提供的xzSQLDeploy類似(我的沒有GUI界面,難看些,呵呵)?,F在項目要驗收了,用戶忽然要求作一個所謂的數據庫遠程安裝程序,就是說在任何一臺聯網的機器上(可能沒有安裝ORACLE客戶端),只要運行安裝程序,就能對指定的數據庫服務器進行數據庫的安裝和初始化,當然前提是服務器端的ORACLE實例已經建好,并且監聽和實例等服務都啟動了。

我原本考慮了兩個解決的方法:
第一就是看能否在InstallShield里能否遠程訪問?如果行,就直接調用服務器上的SQLPLUS執行本地的SRVINST。也就是我昨天問你的問題1。不過看來好像不行呀,我不能要求用戶在安裝前先將服務器網絡資源映射為本地硬盤呀。領導那兒也通不過的。

第二就是干脆將ORACLE的客戶端打包到安裝程序里(雖然有點版權問題,好在服務器端的ORACLE是用戶掏錢了的,將就點了)。
具體是:
1.將打包的ORACLE 9i的客戶端文件和數據庫創建及初始化程序SRVINST(install.bat與SQL文件)拷貝到執行安裝程序的本地機器上。
2.顯示一對話框,讓用戶輸入遠程的ORACLE 服務器的機器名。
3.修改本地ORACLE 9i的客戶端中$ORACLE_HOME/network/admin/tnsnames.ora文件, 將“HOST = pk”改為“HOST = 用戶輸入的ORACLE 服務器的機器名”。
4.導入有關ORACLE 9i的客戶端的注冊表。
5.重新啟動機器。
6..在腳本里通過LaunchAppAndWait()函數本地調用install.bat文件,遠程創建數據庫及初始化。

在安裝過程中重新啟動機器然后繼續剩余的安裝過程,對于這一點我一直沒能解決,也就是我昨天跟你請教的問題2了。

呵呵,羅嗦了半天,不知道講清楚了沒。主要是我覺得你講的在注冊表里進行處理來解決重新啟動的方法對我好像不適用,同時也是想聽聽你的意見,看看我這么處理好不好。

對了,昨天在CSDN上查到一篇有你的回復的帖子: http://search.csdn.net/Expert/topic/2105/2105147.xml?temp=.7887689
你那個處理方法好像適合我,但是我試了試,沒成功。可能是哪個地方用得不對,我剛剛用INSTALLSHIELD X,很多地方不清楚,能否請你說得詳細點。我的MSN是:pk010@hotmail.com,能否加我?

說句題外話,你文章里的圖片是用什么軟件處理的,蠻漂亮呀,想學學。

# re: [InstallShield] 卸載相關問題 2004-10-28 11:10 piggybank
對于 網絡映射,其實可以用 cmd shell 提供的 net.exe 實現: net use ...(用 net help use 察看詳細信息)。當然,這個方法并不好。
你說的在目標計算機上安裝客戶端是一個辦法。事實上,該計算機如果有需要對遠端的數據庫服務器進行操作,那就表明該計算機被用作管理計算機。所以,安裝 Oracle 客戶端在邏輯上是很正確的。
還有一個替代辦法就是采用 java 寫一段程序去設置遠端數據庫服務器,然后編譯為 exe,采用 JDBC適當的驅動,就不必依賴客戶端支持了。但同樣地要部署 J2SE/J2SD 和 JDBC 驅動,也一樣麻煩,呵呵。(這一點倒是提醒我可以繼xzSQLDeploy 之后做一個 java 版本支持 oracle/mysql)

對于 Web 應用的部署,我一直認為在安裝過程中進行 WebServer/DBServer 配置并不是一個好辦法。也就是說這與安裝本身在邏輯上是不同的兩件事情。
其實看你列出來的步驟,運行 Install.bat 其實已經是安裝完畢之后的事情了。邏輯上也和上面的觀點一致。那么,就與那個帖子中提到的“重啟之后繼續安裝”有所區別。
因此,重點解決“如何重啟”,或者“如何提示用戶重啟”的問題即可。
對于重新啟動,上面的回復中已經提到 IS 在安裝過程中如果發現啟動組或者那些注冊表項內容變化就會在結束安裝時提示用戶重新啟動。如果要強制重新啟動或者明確地提示用戶需要重新啟動,就要在腳本中改一改。
比如采用 sdFinishReboot 或者 RebootDialog 對話框(麻煩看一下幫助,最近比較忙)。系統重新啟動后執行你的批處理,就 OK 了。

呵呵,至于圖片嘛...

是用 SnagIt 7.x 抓圖,并用它的圖片處理功能處理的,值得推薦 ^oo^

# re: [InstallShield] 卸載相關問題 2004-10-28 11:16 piggybank
對了,記得 System 可以重新啟動系統,補充查了一下參數:
分別試試看:
System(SYS_BOOTMACHINE);
System(SYS_BOOTWIN);
以前版本的 help 中見過這個用法,但在 ISX 的幫助中關聯的文檔似乎不正確,所以找不到具體的地址,沒記錯的話應該是上面兩個命令也可以讓系統重啟——而不提示用戶。
當然,當前用戶要有足夠權限才行。

# re: [InstallShield] 卸載相關問題 2004-10-28 11:22 piggybank
嗯,確定了。
ISX 推薦 sdFinishReboot 或者 RebootDialog ,而 System(SYS_BOOTMACHINE) 只是為了兼容過去的 Professional 版本而設置。
前者有對話框提示用戶,比較友好一些。后者直接就試圖重新啟動了。

# re: [InstallShield] 卸載相關問題 2004-10-28 11:33 pk
哈哈,你的回帖可真快呀。
謝謝了,馬上試試!

# re: [InstallShield] 卸載相關問題 2004-11-10 16:51 fangzq
請教一下:安裝在系統目錄下的文件在卸載的時候怎么刪除掉?Component中有個選項Permanent的說明中說SystemFolder下的文件都不刪除的,有什么方法解決嗎?謝謝

# re: [InstallShield] 卸載相關問題 2004-12-1 19:28 piggybank
I had answered your questions on CSDN Forum :)

# re: [InstallShield] 卸載相關問題 2004-12-8 8:26 james
向您請教一個問題。
我在一個project里做了2個release,一個單文件,一個多文件的。
為什么編譯后,多文件的程序卸載時會出現WELCOME窗口,而單文件的不會出現,Enable Maintenance 已經設置為NO,難道一個project里不能同時存在多個release嗎?請您幫忙解答一下,thanks very much!

# re: [InstallShield] 卸載相關問題 2004-12-8 8:27 james
sorry,忘了說一句,我使用的installshield是9.0

# re: [InstallShield] 卸載相關問題 2004-12-8 9:11 piggybank
應該不會的,IS9 我也用了一段時間的。不同的 Release 只不過是打包方式不同罷了(比如是否包含ISScript引擎、是否壓縮等等),是不是你用的卸載方式不同?比如安靜卸載模式下或者用了MSIExec 的卸載。

EnableMaintenance 已經設置為NO的話,應該不會有維護界面出現——建議你還是看看 OnMaintBefore 的事件處理代碼,我不確定IS9 和 ISX 具體的不同(呵呵,畢竟我沒必要專門去對比一下每個版本),但 ISX 在一些細節上稍稍調整了一下,也許問題是在這里。
還有,修改了設置后是否把兩個 Release 都重新編譯過?測試的時候是否把原來的安裝卸載了在同樣的新的Release下測試的?

排除這些干擾再看看,可以肯定的是一個 Project 里不但可以存在多個 Release,還可以做多個 Patch :)

[InstallShield] 卸載相關問題


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中文字幕在线观看亚洲日韩 | 日韩区欧美区 | 久久99热这里只有精品高清 | xxxwww欧美| 久久这里只有精品1 | 久久成人在线 | 日韩视频网址 | 国内精品久久久久影院免费 | 日韩在线一区二区 | 奇米影视色 | 激情一区二区三区 | 天天夜夜骑 | 99国产在线 | 亚洲精品国产第一综合99久久 | 无人码一区二区三区视频 | 九九涩| 四虎国产精品永久地址99新强 | 国自产拍在线天天更新2019 | 免看一级一片一在线看 | 精品一区二区三区在线观看 | 香蕉视频免费在线 | 国产一级特黄高清在线大片 | 欧美亚洲另类视频 | www.久久在线 | 日韩中文视频 | 亚洲精品久久久久网站 | 亚洲欧美日韩国产精品第不页 | 国产大片免费观看中文字幕 | 午夜精品久久久久久久2023 | 四虎影视在线影院4hu | 站长推荐国产午夜免费视频 | 亚洲天天综合 | 99九九精品国产高清自在线 | 青青草久草视频 | 欧美成人免费网在线观看 | 午夜a毛片 | 中文精品99久久国产 | 第四色激情网 | 精品国产一区二区三区在线观看 | 亚洲欧美综合国产精品一区 | 欧美成人猛男性色生活 |