相關(guān)資訊
本類常用軟件
-
福建農(nóng)村信用社手機(jī)銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416898
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機(jī)銀行客戶端下載下載量:365699
-
快播手機(jī)版下載量:325855
便攜軟件制作的系列教程
2012/3/27 8:27:02 出處:本站原創(chuàng) 人氣:1971次 字號(hào):小 中 大
在NSIS中怎么導(dǎo)入注冊(cè)表。
這有何難,用registry插件嘛:
${registry::RestoreKey} file.reg $var
可是,如果你經(jīng)常在 RestoreKey 后面用 ${registry:write} ,就會(huì)發(fā)現(xiàn),往往導(dǎo)入注冊(cè)表會(huì)失敗,或者寫入的鍵值被reg文件中的舊鍵值覆蓋了,這是為什么呢?
原來,${registry::RestoreKey} 這個(gè)命令并不會(huì)等待導(dǎo)入完成。作者在文檔中寫了:
${registry::RestoreKey} simply exec regedit: regedit /s “[file]“
執(zhí)行的是 Exec 而非 ExecWait 。那么,可能 regedit.exe 尚未啟動(dòng),就開始執(zhí)行下一行命令了。制作一般的安裝包問題不大,但便攜軟件對(duì)執(zhí)行步驟的順序要求更加精確。所以,有些人的代碼是這樣寫的:
${registry::RestoreKey} file.reg $0
Sleep 200
睡一會(huì)。睡多久?睡一秒還是一年,這種盲人摸象的做法,我們完美主義者是不會(huì)使用的。因?yàn)檫@個(gè)命令,有些朋友凡是用到registry插件,都習(xí)慣性地加上個(gè) sleep,這是完全沒有必要的,作者說了:
問:So my question is, what other functions in your plugin behave in the same way (ie do not wait for the registry operation to finish)?
答:registry::RestoreKey is the only one.
那么,用:
ExecWait 'regedit /s "[file]"' $var
不就行了嗎?
你又錯(cuò)了,我們制作便攜軟件的時(shí)候,要對(duì)自己嚴(yán)格要求,在Vista以上的系統(tǒng)中,不經(jīng)過UAC驗(yàn)證,是無法執(zhí)行 regedit /s 這個(gè)命令的(即使導(dǎo)入HKCU中的鍵值也不行)。難道你的每個(gè)軟件都要用戶通過UAC驗(yàn)證以管理員權(quán)限運(yùn)行嗎,完全是別有居心!
可是,在UAC環(huán)境的測(cè)試中,你會(huì)發(fā)現(xiàn),即使不通過UAC驗(yàn)證,${registry::RestoreKey} 這個(gè)命令也可以完成注冊(cè)表導(dǎo)入,難道,作者隱瞞了什么?
于是,作為代碼盲的你,充滿狐疑地打開 NSIS\Include\Registry.nsh ,找到這樣一段代碼:
!define registry::RestoreKey !insertmacro registry::RestoreKey
!macro registry::RestoreKey _FILE _ERR
registry::_RestoreKey /NOUNLOAD ${_FILE}
Pop ${_ERR}
IntCmp ${_ERR} -2 0 0 +10 ;REGEDIT4 ansi file
SetDetailsPrint none
IfFileExists "$SYSDIR\reg.exe" 0 +4 ;reg.exe used in Windows2K/XP/Vista/7
nsExec::ExecToStack "$SYSDIR\reg.exe" import "${_FILE}"
Pop ${_ERR}
StrCmp ${_ERR} 0 +5 0
IfFileExists "$WINDIR\regedit.exe" 0 +3 ;regedit.exe used in Wine
ExecWait "$WINDIR\regedit.exe" /s "${_FILE}"
${_ERR}
IfErrors 0 +2
StrCpy ${_ERR} -1
SetDetailsPrint lastused
!macroend
真是狡兔三窟!registry::RestoreKey失敗后,用reg.exe import,失敗后,又用 regedit.exe /s,我們就要有這種不屈不撓的精神,不要讓一次執(zhí)行的失敗變成Bug。
眼尖的你發(fā)現(xiàn),關(guān)鍵在于這一行:
nsExec::ExecToStack "$SYSDIR\reg.exe" import "${_FILE}"
原來,雖然regedit /s需要管理員權(quán)限,但reg import命令并不需要,這就是${registry::RestoreKey}成功的秘訣。
但是,${registry::RestoreKey}首先嘗試用插件導(dǎo)入,而插件并不等待導(dǎo)入結(jié)束,所以,我們?cè)趹?yīng)用的時(shí)候,要把順序顛倒一下:
nsExec::ExecToStack "$SYSDIR\reg.exe" import "${_FILE}"
Pop $0
${IfNot} $0 == 0
${registry::RestoreKey} "${_FILE}" $0
Sleep 500
${IfNotThen} $0 == 0 ${|} StrCpy ${_OutVar} Error ${|}
${Endif}
nsExec::ExecToStack是等待運(yùn)行結(jié)束的,首先執(zhí)行,假如失敗,再用${registry::RestoreKey},并暫停0.5秒(比較安全的數(shù)值)。當(dāng)以上動(dòng)作始終返回Error的時(shí)候,我們就應(yīng)該考慮做個(gè)標(biāo)記,在便攜軟件結(jié)束的時(shí)候跳過這一次軟件運(yùn)行中的注冊(cè)表修改,不覆蓋原先的reg文件了。
不過,當(dāng)你翻閱 PortableApps.com Launcher 的源代碼時(shí),卻發(fā)現(xiàn)關(guān)于注冊(cè)表導(dǎo)入,僅僅用了一行:
${registry::RestoreKey} $DataDirectory\settings\$0.reg $R9
可為什么感覺上PAL那么穩(wěn)定,極少出錯(cuò)呢?我猜是因?yàn)镻AL的代碼非常繁雜,每個(gè)實(shí)際動(dòng)作以前都有一堆工作,又是讀Launcher.ini,又是轉(zhuǎn)換變量,又是檢測(cè)PAF平臺(tái),慢悠悠的,慢工出細(xì)活吧!
例1:
設(shè)想某一天,某妞將可移動(dòng)磁盤插入電腦A,電腦A為她的U盤分配了盤符 F: 。該妞使用U盤上的便攜軟件打開了儲(chǔ)存于U盤上的幾個(gè)文檔:
F:\1.doc
F:\2.doc
……
在拔出U盤的時(shí)候,她甚至沒有為最后一個(gè)文件存檔,反正所有進(jìn)度都會(huì)自動(dòng)保存嘛!
過了幾日,該妞試圖在電腦B繼續(xù)她的工作,插入U(xiǎn)盤以后,電腦B為她的U盤分配了盤符G: 。當(dāng)她打開便攜軟件的時(shí)候,她會(huì)看到“最近文檔”列表那里顯示著什么呢?
仍然是:
F:\1.doc
F:\2.doc
……
當(dāng)她試圖恢復(fù)上一次”自動(dòng)保存“的文檔,卻提示“找不到……文件”。于是,她發(fā)怒了,發(fā)誓再也不來你的網(wǎng)站。
這正常嗎?太正常了,上次你就是在F盤打開文件的嘛?墒悄氵能完美地使用“最近文件”列表、繼續(xù)上一次的工作嗎?
我們干革命,就是要勇于把正常變?yōu)椴徽。于是,我們需要盤符替換。
什么是盤符替換
所謂盤符替換 (Driver Letter Replacement),就是在檢測(cè)到盤符相對(duì)上一次運(yùn)行時(shí)改變的時(shí)候,將某些文件中的舊盤符替換為新盤符,以實(shí)現(xiàn)用戶數(shù)據(jù)的完美銜接。以上述例子為例,就是在盤符轉(zhuǎn)變?yōu)?G: 的時(shí)候,將最近文檔列表替換為:
G:\1.doc
G:\2.doc
……
讓用戶體會(huì)不到盤符改變帶來的變化,而順利繼續(xù)上一次的工作進(jìn)程。
什么是路徑替換
例2:
設(shè)想某一個(gè)軟件,在配置文件中保存了大量包含軟件路徑的數(shù)據(jù),這些數(shù)據(jù)在軟件首次運(yùn)行時(shí)生成,指向軟件的插件、模板等目錄,假如這些目錄設(shè)置錯(cuò)誤,該軟件便無法正常運(yùn)行。
而某一天,某妞將該便攜軟件從同盤符的一個(gè)目錄移動(dòng)到另一個(gè)目錄,例如:從 f:\XXXPortable 移動(dòng)到 f:\PortableApps\XXXPortable 。
那么,如何保證該軟件正常運(yùn)行呢?假如包含路徑的設(shè)置項(xiàng)不多,我們可以一個(gè)個(gè)地寫入,而假如類似設(shè)置很多(例如ACDSee),或者數(shù)量不定,難道也要一個(gè)個(gè)寫入嗎?所以,我們需要在檢測(cè)到路徑改變時(shí),將所有的 XXXPortable 替換為 PortableApps\XXXPortable 。
目錄格式
在 PortableApps.com Launcher 中,提供了四種類型的目錄格式,分別是:
%VARIABLE% : 正向單斜杠。例如:%PAL:AppDir% = x:\portableapps\xxxportable\app 。主要應(yīng)對(duì)ini、xml等普通配置文件。
%VARIABLE:ForwardSlash% : 反向單斜杠。例如:%PAL:AppDir:ForwardSlash% = x:/portableapps/xxxportable/app
%VARIABLE:DoubleBackslash% : 正向雙斜杠。例如:%PAL:AppDir:DoubleBackslash% = x:\\portableapps\\xxxportable\\app 。主要應(yīng)用于注冊(cè)表(.reg)文件。
%VARIABLE:java.util.prefs% : 反向多斜杠。例如: %PAL:AppDir:java.util.prefs% = /X:///Portable/Apps///App/Name/Portable///App 。主要應(yīng)用于java程序。
我們需要根據(jù)替換文件的類型選擇相應(yīng)的目錄形式。假如遇到這四種情況以外的目錄形式,則要靠 Custom Code 解決。
實(shí)現(xiàn)原理與流程
為了兼顧例1與例2的兩種情況,避免兩種情況同時(shí)發(fā)生,我們要將盤符替換與路徑替換分開,那就是:先替換盤符,再替換不帶盤符的路徑。
在引導(dǎo)過程中,讀取上一次記錄的INI文件,判斷是否盤符/路徑改變。
若改變,則讀取上一次的盤符/路徑,轉(zhuǎn)換為正確形式。
讀取當(dāng)前的盤符/路徑,轉(zhuǎn)換為正確形式。
在文件中替換舊盤符為新盤符。
在文件中替換舊路徑為新路徑。
將當(dāng)前的盤符、路徑寫入INI文件,以便下一次讀取。
在 PortableApps.com Launcher 中實(shí)現(xiàn):
以ACDSee Portable為例,我們需要在引導(dǎo)過程中替換注冊(cè)表文件 HKCU.reg 中的舊盤符\路徑為新。
[FileWrite1]
Type=Replace
File=%PAL:DataDir%\settings\HKCU.reg
Find=%PAL:LastDrive%\\
Replace=%PAL:Drive%\\
[FileWrite2]
Type=Replace
File=%PAL:DataDir%\settings\HKCU.reg
Find=%PAL:LastPackagePartialDir:DoubleBackslash%
Replace=%PAL:PackagePartialDir:DoubleBackslash%
效果如下:
x:\\
替換為:
y:\\
\\xxx\\AppNamePortable
替換為:
\\yyy\\AppNamePortable
請(qǐng)注意,在 [FileWrite1] (盤符替換)中,我在 %PAL:LastDrive% 后面加上了雙斜杠。這是因?yàn)椋?PAL:LastDrive% 是不帶斜杠的(x:)?赡艹霈F(xiàn)這種情況:替換 D:,把 DWORD: 的最后兩個(gè)字母也替換了。難道PortableApps.com的人不擔(dān)心這種情況嗎?我認(rèn)為使用PAL替換盤符的時(shí)候都要注意這一點(diǎn),替換盤符一定要加斜杠。
在 Custom Code 中實(shí)現(xiàn):
PortableApps.com Launcher 是一個(gè)死板的網(wǎng)站的死板的程序員做出的死板的工具,在險(xiǎn)峻難料的革命事業(yè)中,我們要堅(jiān)決摒棄教條主義思想。許多時(shí)候稍有變化,我們就需要用到 Custom Code 。那么,在NSIS語言中怎樣實(shí)現(xiàn)呢?
例如,一個(gè)程序以這樣的形式在 Data\File.txt 記錄路徑:
F__PortableApps_App_Portable
“:”、“\”、“空格”三種符號(hào)都轉(zhuǎn)換為下劃線。讓我們來寫一段 Custom Code 來解決它。
${SegmentPrePrimary}
; 替換盤符
; 首先讀取Ini文件中的記錄
ReadINIStr $0 $DataDirectory\settings\$AppIDSettings.ini $AppIDSettings LastDrive
; 替換三種符號(hào)為下劃線
${WordReplace} "$0\" "\" "_" "+" "$R0"
${WordReplace} "$R0" ":" "_" "+" "$R0"
${WordReplace} "$R0" " " "_" "+" "$R0"
; 得到當(dāng)前盤符
StrCpy $R1 "$AppDirectory" 3
; 替換三種符號(hào)為下劃線
${WordReplace} "$R1" "\" "_" "+" "$R1"
${WordReplace} "$R1" ":" "_" "+" "$R1"
${WordReplace} "$R1" " " "_" "+" "$R1"
; 在文件中替換
${ReplaceInFileCS} "$DataDirectory\File.txt" $R0 $R1
; 替換路徑
; 首先讀取Ini文件中的記錄
ReadINIStr $0 $DataDirectory\settings\$AppIDSettings.ini $AppIDSettings LastDirectory
; 替換兩種符號(hào)為下劃線
${WordReplace} "$0" "\" "_" "+" "$R0"
${WordReplace} "$R0" " " "_" "+" "$R0"
; 得到當(dāng)前路徑(不帶盤符)
StrCpy $R1 "$AppDirectory" "" 2
; 替換兩種符號(hào)為下劃線
${WordReplace} "$R1" "\" "_" "+" "$R1"
${WordReplace} "$R1" " " "_" "+" "$R1"
; 在文件中替換
${ReplaceInFileCS} "$DataDirectory\File.txt" $R0 $R1
!macroend
請(qǐng)注意文件的編碼,如果是 UTF-16LE 編碼,用 ${ReplaceInFileUTF16LECS} 。若需要忽略大小寫,取消最后的“CS”。
在原始NSIS腳本中使用,需要另外:
!include "TextReplace.nsh"
!include "ReplaceInFileWithTextReplace.nsh"
注意事項(xiàng)
盤符與路徑替換是一種簡(jiǎn)單地銜接工作環(huán)境的方法,但我認(rèn)為,在應(yīng)用中需要注意以下幾點(diǎn):
一定要確定你替換的是盤符/路徑,而非別的東西。例如,使用PAL的時(shí)候,在盤符后加入斜杠,替換 x:\ 而不是 x: 。
自行撰寫代碼時(shí),注意所替換文件的編碼。
在替換大文件或多次替換之間,加入Sleep。否則可能遇到替換失敗。
對(duì)于重要路徑,最好在替換后手動(dòng)寫入一次,以保障無誤。盤符替換依賴INI文件中的記錄,假如一次記錄與實(shí)際銜接不上,可能從此都銜接不上了。
自從去年心血來潮開了個(gè)頭,這個(gè)教程就一直沒了下文,我要用實(shí)際行動(dòng)粉碎虎頭蛇尾的謠言,同志們,今天來談?wù)?DefaultData。
剛開始制作便攜軟件的朋友常犯的一個(gè)錯(cuò)誤是,將軟件的默認(rèn)配置保存到 Data 目錄中。何以說是錯(cuò)誤呢:
PortableApps.com格式便攜軟件在安裝后,Data目錄必須是空的。Data目錄中的文件必須在首次運(yùn)行后生成。
合格的P.A格式便攜軟件,用戶可以隨時(shí)刪除Data目錄,將便攜軟件恢復(fù)到初始狀態(tài)。
因此,如果某些默認(rèn)配置在軟件第一次運(yùn)行時(shí)必須導(dǎo)入,我們應(yīng)該將它保存到DefaultData目錄中。
DefaultData 的誕生
在一個(gè)不可考證的從前,John T. Haller 同志(PortableApps.com 的創(chuàng)始人)開始制作他的第一個(gè)便攜軟件:Firefox Portable。在移動(dòng)介質(zhì)運(yùn)行的 Firefox 瀏覽器應(yīng)該有如下調(diào)整:關(guān)閉磁盤緩存,不檢測(cè)默認(rèn)瀏覽器,不設(shè)置默認(rèn)下載目錄,同時(shí),他希望在Firefox的默認(rèn)書簽內(nèi)加入他的網(wǎng)站地址。如何實(shí)現(xiàn)以上默認(rèn)設(shè)置的調(diào)整呢?
直接修改程序?吃力不討好。于是,他在 App 目錄下新建了 DefaultData 目錄,將一份配置好的最簡(jiǎn)化的配置保存于此。在Firefox首次運(yùn)行時(shí),DefaultData 目錄的內(nèi)容會(huì)被復(fù)制到 Data 目錄,以實(shí)現(xiàn)設(shè)置默認(rèn)配置的目的。于是,今天的 Firefox Portable(以及所有標(biāo)準(zhǔn)P.A格式便攜軟件)的結(jié)構(gòu),就成了這個(gè)樣子:
-\ <--- Directory with FirefoxPortable.exe
+\App\
+\AppInfo\
+\firefox\
+\DefaultData\
+\profile\
+\settings\
+\plugins\
+\Data\
FirefoxPortable.exe
什么是 DefaultData
通過以上敘述我們已經(jīng)知道,DefaultData 是 PortableApps.com 格式便攜軟件的標(biāo)準(zhǔn)部件之一,它位于 App\DefaultData ,是軟件的默認(rèn)配置。在首次運(yùn)行時(shí),它被復(fù)制到 Data 目錄,DefaultData 內(nèi)部的文件結(jié)構(gòu)應(yīng)該和 Data 目錄完全一致。
DefaultData 怎樣工作?
DefaultData在首次運(yùn)行時(shí)復(fù)制到 Data 目錄,作為初始的程序配置。判斷是否首次運(yùn)行有幾種不同的方式:
Firefox Portable 的方式:
Firefox Portable 通過 NSIS 語言寫成,它通過檢查 Data\Profile\prefs.js是否存在來判斷是否首次運(yùn)行,假如 Data\Profile\prefs.js 不存在,則復(fù)制默認(rèn)配置到Data目錄。這種方式較為靈活,可根據(jù)不同軟件的具體情況選擇不同的判斷物:
ProfileWork:
;=== Check for an existing profile
IfFileExists "$PROFILEDIRECTORY\prefs.js" ProfileFound
;=== No profile was found
StrCmp $ISDEFAULTDIRECTORY "true" CopyDefaultProfile CreateProfile
CopyDefaultProfile:
CreateDirectory "$EXEDIR\Data"
CreateDirectory "$EXEDIR\Data\plugins"
CreateDirectory "$EXEDIR\Data\profile"
CreateDirectory "$EXEDIR\Data\settings"
CopyFiles /SILENT $EXEDIR\App\DefaultData\plugins\*.* $EXEDIR\Data\plugins
CopyFiles /SILENT $EXEDIR\App\DefaultData\profile\*.* $EXEDIR\Data\profile
PortableApps.com Launcher 的方式:
PortableApps.com Launcher 通過檢查 Data\settings目錄是否存在判斷首次運(yùn)行,PAL在運(yùn)行一次以后必然創(chuàng)建 Data\settings 目錄,如果此目錄不存在,則判斷為首次運(yùn)行,并復(fù)制 DefaultData:
${IfNot} ${FileExists} $EXEDIR\Data\settings
CreateDirectory $EXEDIR\Data\settings
${If} ${FileExists} $EXEDIR\App\DefaultData\*.*
CopyFiles /SILENT $EXEDIR\App\DefaultData\*.* $EXEDIR\Data
${EndIf}
${EndIf}
第三種方式:
在制作具有中國特色的便攜軟件時(shí),有時(shí)會(huì)碰到更為復(fù)雜的情況。為了保證軟件始終從默認(rèn)配置的基礎(chǔ)上啟動(dòng),我們可以分別判斷多個(gè)目錄,缺少哪一個(gè),就復(fù)制哪一個(gè):
例一,
若Data\Profile不存在則復(fù)制DefaultData\Profile,若Data\Plugins不存在則復(fù)制DefaultData\Plugins:
${IfNot} ${FileExists} $EXEDIR\Data\Profile
CreateDirectory $EXEDIR\Data\Profile
CopyFiles /Silent $EXEDIR\App\DefaultData\Profile\*.* $EXEDIR\Data\Profile
${EndIf}
${IfNot} ${FileExists} $EXEDIR\Data\Plugins
CreateDirectory $EXEDIR\Data\Plugins
CopyFiles /Silent $EXEDIR\App\DefaultData\Plugins\*.* $EXEDIR\Data\Plugins
${EndIf}
例二,
在迅雷便攜版中應(yīng)用到的,檢測(cè)任何一個(gè) DefaultData 中的目錄,如果在 Data 目錄中不存在,都復(fù)制過去:
Section Main
; ......
; CopyDefaultData:
StrLen $R0 "$EXEDIR\App\DefaultData\"
${Locate} "$EXEDIR\App\DefaultData" "/L=D" CopyDefaultData
; ......
SectionEnd
Function CopyDefaultData
StrCpy $R1 $R9 "" $R0
${IfNot} ${FileExists} "$EXEDIR\Data\$R1"
CreateDirectory "$EXEDIR\Data\$R1"
CopyFiles /Silent "$R9\*.*" "$EXEDIR\Data\$R1"
${Endif}
Push $0
FunctionEnd
DefaultData 能做什么
修改默認(rèn)配置
例如,在 Evernote Portable 中,將以下內(nèi)容保存為 App\DefaultData\settings\EvernotePortable.reg:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Evernote\Evernote]
"UpdateToPreReleaseVersion"=dword:00000000
"CheckForUpdatesAtLaunch"=dword:00000000
則會(huì)在首次運(yùn)行時(shí)復(fù)制為 Data\settings\EvernotePortable.reg ,接著導(dǎo)入注冊(cè)表,實(shí)現(xiàn)默認(rèn)關(guān)閉自動(dòng)升級(jí)的目的。
程序本身的默認(rèn)/初始配置
通過 Total Uninstall 監(jiān)測(cè)軟件安裝,可發(fā)現(xiàn)某些軟件在首次安裝后會(huì)在配置目錄中寫入一些文件,這些文件必須放到 DefaultData 目錄,以保證程序的完整性,以及讓用戶隨時(shí)可以刪除 Data 目錄恢復(fù)軟件初始配置。
通過 DefaultData 新建文件夾
在 PortableApps.com Launcher 中,如果你希望使用 FilesMove 來移動(dòng)文件,必須保證 Data 目錄中有這個(gè)文件的父目錄,否則移動(dòng)會(huì)失敗,例如:
[FilesMove]
config\file.txt=%PAL:AppDir%\AppName
在此例中,假如Data\config目錄不存在,那么file.txt就無法被移動(dòng)到Data目錄。
解決辦法是,創(chuàng)建 App\DefaultData\config ,那么,首次運(yùn)行時(shí),App\DefaultData\config 會(huì)被復(fù)制為 Data\config ,以實(shí)現(xiàn)新建文件夾的目的。
不過,在大多數(shù)情況下,將單個(gè)文件保存到 Data\settings 中是更好的方法,PAL會(huì)自動(dòng)創(chuàng)建此文件夾,避免了通過 DefaultData 來創(chuàng)建的麻煩。
其它用途
在制作具有中國特色的便攜軟件時(shí),有時(shí)我們希望一些軟件配置永遠(yuǎn)是“一次性”的(例如廣告目錄),那么,我們將一份干凈的初始配置保存到 DefaultData 中,在每次軟件啟動(dòng)時(shí)復(fù)制到配置目錄,在軟件結(jié)束時(shí)刪除掉復(fù)制的副本。以保證軟件的潔凈。
注意事項(xiàng)
DefaultData 是 Data 目錄的初始狀態(tài),其目錄、文件結(jié)構(gòu)必須和 Data 目錄完全一致。假如你在設(shè)計(jì)便攜軟件時(shí)設(shè)定將注冊(cè)表導(dǎo)出到 Data\settings\AppNamePortable.reg,那么你應(yīng)該將默認(rèn)配置保存為 App\DefaultData\settings\AppNamePortable.reg 。否則無法奏效。
DefaultData 是軟件初始配置的一份存檔,應(yīng)該盡量保持精簡(jiǎn)。僅僅保留最必要的部分。你不應(yīng)該將整個(gè)配置好的 Data 保存為 DefaultData,那樣浪費(fèi)空間,延長首次啟動(dòng)的時(shí)間,而應(yīng)該找出真正有必要的、不可缺少的修改部分,保存為 DefaultData 。如果你的 DefaultData 超過1M,那么就該想想辦法了。
DefaultData 應(yīng)該保留最通用的部分,如果你的 DefaultData 中存在關(guān)于你的計(jì)算機(jī)的信息,例如:installdir=c:\Program Files\AppName ,那么是非常不專業(yè)的,我們要嚴(yán)格要求自己。
通過 Total Uninstall 監(jiān)視軟件安裝,可發(fā)現(xiàn)某些軟件自身的默認(rèn)配置。有時(shí)候這些配置很重要(例如一個(gè)初始的數(shù)據(jù)庫),請(qǐng)別忘了把它們保存到 DefaultData。