大家在做安裝包的時候常常會遇到更新等問題,在使用installshield製作安裝包,如果軟件版本發生改變,那麼更新是自動完成的。但是我們這裡有一個問題,在installshield如果新版本的regist信息和舊版本的regist信息發生了改變,比如說註冊表結構改變,或是不需要以前的註冊表目錄想要刪除時,那麼在運行新的安裝程序時候,程序必然會報錯。。這樣就是為啥好多軟件安裝新版本的時候他會要求你刪除原先的版本在繼續進行安裝(一開始我的解決方案是將以前註冊的dll通過腳本刪除,但是發現雖然dll的註冊信息刪除了,但是其程序還在添加和刪除安裝程序中,所以此方法不可行)。現在給大家講下怎麼實現判斷以前版本是否安裝,並提示用戶刪除。
在installshield裡面有Product Code這個選項,它的意思就是一個特定是產品編碼,來確定是否是同一個軟件的。下面這個是我們舊版本的截圖。
新版本的Product Code如下
在更遍了Product Code後,在運行安裝包的同時就不會出現升級的界面了,但是這樣的話會在機器裡面出現一個軟件的兩個版本,對用戶來說這是相當不禮貌的做法啊。
所以我們想如何能判斷用戶是否安裝了以前的版本並提示他刪除,這樣的話我在註冊表信息裡面找啊找終於被我找到了。。
在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall{你的產品Code},如果用戶安裝了你的軟件並且沒有卸載就會在這裡出現這條註冊信息。。
這樣的話我們現在的問題就是如何在安裝得時候檢測到這條註冊表信息,並提示用戶卸載這個版本。
我們的目的是在安裝之前檢測並提示所以要在function OnFirstUIBefore()中寫入腳本。我找到一個函數
RegDBKeyExist(“\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{你的產品Code}”);
其返回值為-1代表沒有找到這條註冊信息,1為找到這條註冊信息。
使用這個函數前需要使用這個函數來確定進行註冊表操作的根目錄:
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
知道這些後咱們的任務基本完成啦,附上代碼:
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); if(RegDBKeyExist(“\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{5E3673E9-3F06-40B7-B852-5A52D43316D9}”)>0) then MessageBox(“安裝軟件檢測到較早版本,為保證軟件正確安裝請卸載該版本,安裝程序即將結束。”,SEVERE); abort; endif;
其實代碼是很簡單的,主要是installshield得腳本語言大家都不熟悉,而且網上資料比較少。
刪除註冊的函數RegDBDeleteKey(string)
給大家我找到的一份installshield的腳本語言函數等的介紹合計,希望對大家以後的工作有所幫助哈!
InstallShield內部庫函數
本篇文章來源于職場幫(www.guan8.net) 原文出處︰http://www.guan8.net/Java/1072851.html
暂无评论内容