精品久久看,欧美成人久久一级c片免费,日本加勒比在线精品视频,国产一区二区三区免费大片天美,国产成人精品999在线,97理论三级九七午夜在线观看

當前位置: 首頁IT技術 → 便攜軟件制作的系列教程

便攜軟件制作的系列教程

更多

在NSIS中怎么導入注冊表。

這有何難,用registry插件嘛:

${registry::RestoreKey} file.reg $var

可是,如果你經常在 RestoreKey 后面用 ${registry:write} ,就會發現,往往導入注冊表會失敗,或者寫入的鍵值被reg文件中的舊鍵值覆蓋了,這是為什么呢?

原來,${registry::RestoreKey} 這個命令并不會等待導入完成。作者在文檔中寫了:

${registry::RestoreKey} simply exec regedit: regedit /s “[file]“

執行的是 Exec 而非 ExecWait 。那么,可能 regedit.exe 尚未啟動,就開始執行下一行命令了。制作一般的安裝包問題不大,但便攜軟件對執行步驟的順序要求更加精確。所以,有些人的代碼是這樣寫的:

${registry::RestoreKey} file.reg $0

Sleep 200

睡一會。睡多久?睡一秒還是一年,這種盲人摸象的做法,我們完美主義者是不會使用的。因為這個命令,有些朋友凡是用到registry插件,都習慣性地加上個 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

不就行了嗎?

你又錯了,我們制作便攜軟件的時候,要對自己嚴格要求,在Vista以上的系統中,不經過UAC驗證,是無法執行 regedit /s 這個命令的(即使導入HKCU中的鍵值也不行)。難道你的每個軟件都要用戶通過UAC驗證以管理員權限運行嗎,完全是別有居心!

可是,在UAC環境的測試中,你會發現,即使不通過UAC驗證,${registry::RestoreKey} 這個命令也可以完成注冊表導入,難道,作者隱瞞了什么?

于是,作為代碼盲的你,充滿狐疑地打開 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,我們就要有這種不屈不撓的精神,不要讓一次執行的失敗變成Bug。

眼尖的你發現,關鍵在于這一行:

nsExec::ExecToStack "$SYSDIR\reg.exe" import "${_FILE}"

原來,雖然regedit /s需要管理員權限,但reg import命令并不需要,這就是${registry::RestoreKey}成功的秘訣。

但是,${registry::RestoreKey}首先嘗試用插件導入,而插件并不等待導入結束,所以,我們在應用的時候,要把順序顛倒一下:

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是等待運行結束的,首先執行,假如失敗,再用${registry::RestoreKey},并暫停0.5秒(比較安全的數值)。當以上動作始終返回Error的時候,我們就應該考慮做個標記,在便攜軟件結束的時候跳過這一次軟件運行中的注冊表修改,不覆蓋原先的reg文件了。

不過,當你翻閱 PortableApps.com Launcher 的源代碼時,卻發現關于注冊表導入,僅僅用了一行:

${registry::RestoreKey} $DataDirectory\settings\$0.reg $R9

可為什么感覺上PAL那么穩定,極少出錯呢?我猜是因為PAL的代碼非常繁雜,每個實際動作以前都有一堆工作,又是讀Launcher.ini,又是轉換變量,又是檢測PAF平臺,慢悠悠的,慢工出細活吧!

熱門評論
最新評論
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數: 0/500 (您的評論需要經過審核才能顯示)
主站蜘蛛池模板: 国产精品高清一区二区三区不卡 | 久久精品亚洲一级毛片 | 久久国产视屏 | 国产精品久久久久久久专区 | 色列里番不知火舞h本全彩无遮挡 | 国产成人99久久亚洲综合精品 | 国产日韩欧美亚洲精品95 | 成人黄色在线播放 | 国产亚洲综合久久 | 激情五月婷婷小说 | 色吧五月婷婷 | 六月丁香综合网 | 天天碰夜夜 | 91精品国产99久久 | 久久综合精品不卡一区二区 | 亚洲综合伊人 | 人人艹人人爽 | 国产午夜精品久久久久 | 国产午夜精品一区二区三区不卡 | 国产在线播放网址 | 日本高清色www网站色 | 免费视频 久久久 | 日本加勒比在线 | 99re免费| 久久不卡一区二区三区 | 久久婷婷五月综合色丁香 | 嫂子的职业电影在线观看 | 狠狠色噜噜狠狠色综合久 | 奇米手机在线 | 97在线亚洲 | 成年女人黄小视频 | 日韩精品在线观看视频 | 精品午夜视频 | 色婷婷.com | 97天天操| 国语精品视频在线观看不卡 | 精品无人乱码区1区2区3区 | 国产亚洲欧美久久久久 | 久久97久久99久久综合 | 奇米影视四色首页手机在线 | 久久久夜色精品国产噜噜 |