亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 編程設計 > 正文

NSIS常見問題集錦 推薦新手參考學習

2020-06-27 15:46:14
字體:
來源:轉載
供稿:網友

問:在安裝過程中按“取消”的話,會彈出是否終止安裝的確認窗口,請問怎樣設置可以讓這個窗口不要出現,按“取消”就直接退出呢?

答:!define MUI_ABORTWARNING 把這句去掉就可以了。


問:如何將顯示的“setup 將安裝...”中的“setup”去掉,除了用自定義字串來修改這個地方以外,如何把這個setup搞成其  他的?比如“安裝程序現在將...”

答:DirText "安裝程序將安裝 $(^NameDA) 在下列文件夾。要安裝到不同文件夾,單擊 [瀏覽(B)] 并選擇其他的文件夾。     $_CLICK"

問:如何定義歡迎頁面的標題字體大小。

答:使用以下腳本

復制代碼
代碼如下:

!define MUI_PAGE_CUSTOMFUNCTION_SHOW ChageFONT
!insertmacro MUI_PAGE_WELCOME
Function ChageFONT
GetDlgItem $0 $MUI_HWND 1201
createFont $1 "Tahoma" "11" "700"
SendMessage $0 ${WM_SETFONT} $1 0

問:添加版本號

復制代碼
代碼如下:

VIProductVersion "1.2.3.4"
VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment"
VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "?Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application"
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3"

問:在腳本中加入上面的代碼,則為 NSIS 生成的 exe 添加版本信息。問題就是,能否讓屬性中語言顯示為“中文(中國)”?

答:中文 ID 是 2052。 把 ${LANG_ENGLISH} 改為 2052。

問:用 2052 之后確實變成“中文(中國)”了。但其他內容仍舊是亂碼,不知有什么辦法可以解決嗎?

答:版本信息設置語句,放在 !insertmacro MUI_LANGUAGE 的后面,NSIS 要注重次序的。如果使用古典界面,放在             LoadLanguageFile "${NSISDIR}/Contrib/Language files/SimpChinese.nlf" 的后面。

問:如何禁止顯示 banner 。

答:圖示的效果是因為安裝程序初始化的時候,也就是 .onInit 函數里需要用到某個文件的時候安裝程序需要搜索整個數據區塊    來把它解壓出來,當安裝程序比較大的時候搜索比較費時,這個時候才顯示解壓百分比。一般都是用 ReserveFile 來避開    這種搜索。比如 Function .onInit 里有:


復制代碼
代碼如下:

InitPluginsDir
File "/oname=$PLUGINSDIR/io.ini" "./io.ini"

或者其他類似的話,安裝程序就需要搜索并解壓這個文件。一般在腳本頭部加:

程序代碼

復制代碼
代碼如下:

ReserveFile "./io.ini"

這樣 io.ini 就保存在數據區塊的尾部,安裝程序初始化的時候就不用搜索整個數據區塊了,相當于加快了安裝程序的啟動    速度。


問:根據以上方法使用了,確實不會再出現初始化的對話框了,但是在自定義的 InstallOptions 頁顯示前,程序還是會停頓一 段時間,請問這是為何?如何避免?


答:某些控件比較消耗時間的,比如顯示 ICON、位圖 等,如果 InstallOptions 里含有這些控件可能會停頓。如果   InstallOptions 是第一個頁面的話還要把 InstallOptions.dll 加入到 ReserveFile 參數里。再或者就是進入InstallOptions 的時候含有比較復雜的指令,比如循環等。

一般在加入 ReserveFile ${NSISDIR}/Plugins/InstallOptions.dll 既可避免。

問:如何運行一個安裝文件 .inf

答:ExecWait "RunDll32 advpack.dll,LaunchINFSection skins.inf,DefaultInstall"

問:關聯文件圖標后,圖標沒變化。

答:刷新圖標用, System::Call shell32.dll::SHChangeNotify(l, l, i, i) v (0x08000000, 0, 0, 0)

問:我用NSIS做好了一個安裝程序,因為數據較多,一共有400多M,用的LZMA壓縮方式,做好后的安裝程序約200M,但是我發現 在運行這個安裝程序時會在系統TEMP目錄產生一個同安裝后的全部內容同樣大的臨時文件(一邊運行一邊加大,最后到400多M去了),如果我做的程序小倒沒什么,可是這個程序有400多M,除了要寫入安裝的數據外還要同樣大小的空間放臨時文件,這樣子也實在是太花不來,我想請問:有什么辦法能讓其在安裝時不使用這么多的臨時空間嗎?安裝的腳本是用HM NISEdit的向導生成的。

答:這是因為 NSIS 在用 LZMA 時采用了固實壓縮,何謂固實壓縮,其實就是把所有文件統一起來壓縮,所以這樣壓出來的文件  更加的小,同時也帶來了一個問題,安裝解壓的時候,在臨時文件夾中生成一個臨時文件,隨著安裝的進程逐漸增大,到最 后,需要臨時文件會變成跟原安裝程序一樣大,也就是說,需要原安裝程序 2 倍的空間才可以安裝這個程序,所以對于安裝大量文件時,這是不適合的。

NSIS 2.07 版本之前 LZMA 算法是固實壓縮的,沒有非固實的選項,如果需要這樣做,只有下載非固實壓縮的編譯器,但 2.07 后的 NSIS 的 LZMA 壓縮已經改為默認非固實壓縮了,所以這個問題同時也不再存在。如果在制作少量文件的安裝時,仍然想取用固實壓縮可以加入 /SOLID 參數。

像這樣: SetCompressor /SOLID lzma


問:能不能在 Section 區段中實現讀取INI文件狀態來安裝。若選中單選框1則安裝1中定義的文件。若不選中則不安裝。若選中單選框2則安裝2定義的文件。若不選則不安裝。

答:使用以下代碼

復制代碼
代碼如下:

!include LogicLib.nsh
Section -post
SetOutPath $INSTDIR
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 2" "State"
${If} $INI_VALUE = 1
File /a "./file/fileA.exe"
File /a "./file/fileB.exe"
${EndIf}
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 3" "State"
${If} $INI_VALUE = 1
File /a "./file/fileA.exe"
${EndIf}
SectionEnd

 或者使用以下代碼

程序代碼

復制代碼
代碼如下:

!include LogicLib.nsh
Section -post
SetOutPath $INSTDIR
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 2" "State"
${If} $INI_VALUE = 1
;選中時執行的代碼
File /a "./file/fileA.exe"
File /a "./file/fileB.exe"
${Else}
;不選中時執行的代碼
File /a "./file/fileA.exe"
${EndIf}
SectionEnd

問:在 NSIS 中如何設置工作目錄,例如一些文件的快捷方式,還有安裝完一個軟件后運行一個程序,而這個程序需要檢測當前工作目錄下的某個文件,這時候設置工作目錄尤為重要,否則程序不能正常運行。

答:NSIS 中設定工作目錄使用 SetOutPath,例如在運行程序的代碼 ExecWait "$INSTDIR/test2.exe" 前放入 SetOutPath  $INSTDIR,那么 $INSTDIR 將會成為當前的工作目錄,建立快捷方式也會把工作目錄設為 $INSTDIR。卸載之前運行某程序只需要把運行指令放到 Function un.onInit 里就行


問:記得以前看到有帖子介紹過可在NSIS中調用.inf文件安裝附加驅動程序,具體實現代碼如下形式:

復制代碼
代碼如下:

ExecWait "RunDll32 advpack.dll,LaunchINFSection drivers.inf,DefaultInstall"

問:偶在打包一小東東時使用了這一方法,但遇到的問題時,如果在卸載區段里設置能自動卸載安裝過的驅動程序呢?

答:能否卸載需要看 INF 文件里面是否有卸載的區段,例如使用 NSIS 卸載 Windows Messenger 可以這樣:


程序代碼

復制代碼
代碼如下:

ExecWait "RunDll32 advpack.dll,LaunchINFSection $windir/INF/msmsgs.inf,BLC.Remove"

 關于 BLC.Remove 的來源,可以打開 msmsgs.inf 文件后,能找到名稱為 BLC.Remove 的區段,該區段用于卸載。區段的    名稱是編寫者自己定制的。不同的inf文件,區段名也可能不同。其他的 *.inf 文件也可以按照此類做法。

問:(問題如下)
  1、我做了一個可同時在簡繁英下執行的安裝程序。但有個很大的困惑。剛開始時做的是簡體中文版,在簡中下當然沒問題, 但在英/繁下,創建的中文程序組名和寫注冊表時顯示的是亂碼。于是想到寫一個三者皆適合的安裝程序。我的做法是這樣的,在涉及到創建中文程序組和寫注冊表時,加入一個判斷,如果英文或繁體,則分別創建英文文件名和big5內碼文件名。但在繁體winxp和英文win2k下測試后,發現根本無法正常創建程序組,也無法正常生成uninstall.exe文件。而寫入注冊表的中文字符,也不能在繁體系統的注冊表中正常顯示,而是亂碼。請教高手,這種多語言環境下該怎么處理,才能正常顯示呢? 總不能全部都給創建成英文的吧?

  2、另外有個小問題,如何讓nsis做的安裝程序不顯示具體的安裝文件名,而只顯示“正在復制文件……”?象foobar那樣,可惜foobar也有個顯示詳細情況的按鈕,我想在復制文件過程中完全不顯示和提示被復制的文件情況。


答:(解答如下)

  1、最簡單的處理辦法就是給需要處理的資源進行一個定義,然后使用 LangString 定義不同的資源。給個示例:


程序代碼

復制代碼
代碼如下:

Caption "$(CAPTION)"
LangString CAPTION ${1033} "DreamMail Installation"
LangString CAPTION ${2052} "DreamMail 安裝向導"
LangString CAPTION ${1028} "DreamMail w桿翾舊"

2、可以使用 DetailPrint ,示例,
程序代碼

復制代碼
代碼如下:

DetailPrint "正在復制文件..."

問:NSIS對于安裝卸載的ICO圖標大小有什么要求?編譯的時候出現以下錯誤提示:
Error finding icon resources: installer, uninstaller icon size mismatch - see the Icon instructions documentation for more information -- failing!
答:只要保證安裝圖標與卸載圖標大小相同即可。
問:如何屏蔽如下圖中的安裝程序校驗。
答:CRCCheck on|off|force 指定安裝前安裝程序是否對自身執行一個 CRC。注意,如果用戶使用了 /NCRC 命令行參數,且你沒有指定 force 參數時,不會執行 CRC,這樣有可能導致用戶安裝一個損壞的安裝程序。安裝程序 CRC 校驗是默認打開的??梢栽谀_本中用 CRCCheck off 來默認禁止安裝程序的 CRC 校驗。不過這樣做正如解釋上說的可能安裝會出現問題。作漢化的最好加上校驗,免得安裝程序的問題變成你漢化質量的問題。
問:在安裝的時候不是可以選擇多種語言么?但是我怎樣實現當選擇英文時就裝英文版,選擇中文時就裝中文版?
答:使用以下腳本:

復制代碼
代碼如下:

StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +3
File "你需要安裝的中文文件"
Goto lbl_finish
File "你需要安裝的英文文件"
lbl_finish:

問:組件A 組件B 組件C 均為可選,A可單獨安裝,B或者C被選擇的時候A必須被選擇。
答:以下代碼:

復制代碼
代碼如下:

Section "組件 A" aaa
 detailprint "A"
SectionEnd
Section "組件 B" bbb
 detailprint "B"
SectionEnd
Section "組件 C" ccc
 detailprint "C"
SectionEnd
Function .onSelChange
 SectionGetFlags ${bbb} $0
 SectionGetFlags ${ccc} $1
 IntOp $0 $0 1
 IntOp $1 $1 1
 IntCmp $0 1 0 +2
  SectionSetFlags ${aaa} 1
 IntCmp $1 1 0 +2
  SectionSetFlags ${aaa} 1
FunctionEnd

解釋:SectionGetFlags 表示獲取某區段的flags狀態(就是是否被勾選,選中返回值為1,反之為0)。SectionGetFlags ${bbb} $0 表示獲取序號為${bbb}的區段的Flags狀態并把返回值輸出到變量 $0,C 區段相同。接著就是 StrCmp ,解釋同上樓。SectionSetFlags ${aaa} 1 表示設置序號為 ${aaa} 區段的 Flags 狀態為 1,即勾選。
問:怎么讓“許可協議”頁面的標題欄,如程序中的“MutliPages 演示”修改為“MutliPages 演示:許可協議”。
答:首先創建一個函數,如下。

復制代碼
代碼如下:

Function LicensePagePre
SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:我愛你"
FunctionEnd

然后在協議頁面句子

復制代碼
代碼如下:

!insertmacro MUI_PAGE_LICENSE "c:/path/to/licence/YourSoftwareLicence.txt"

  之前加入如下語句

復制代碼
代碼如下:

!define MUI_PAGE_CUSTOMFUNCTION_PRE LicensePagePre

問:比如,我把 a.exe 用nsis包裝好,安裝到 c:/helloLib/a.exe,完成后,想把c:/helloLib/添加到系統環境變量的path 里頭,這樣,在任何地方輸入a.exe可執行。如何將路徑添加到系統環境變量中?
答:以下代碼實現:

復制代碼
代碼如下:

ReadRegStr $0 HKLM "SYSTEM/CurrentControlSet/Control/Session Manager/Environment" "Path"
WriteRegExpandStr HKLM "SYSTEM/CurrentControlSet/Control/Session Manager/Environment" "Path" "$0;C:/hellolib"

  另類方法一:寫注冊表,如

復制代碼
代碼如下:

[HKEY_CLASSES_ROOT/Applications/a.exe/shell/open/command]
@="yourpath/a.exe"

  另類方法二:

復制代碼
代碼如下:

[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/App Paths/a.exe]
@="c:/helloLib/a.exe"

問:在NSIS中如何才能做到根據對于注冊表鍵值的判斷決定是否寫入字串,如果判斷出某個key存在,則寫入相應的字串,如果不 存在,則不寫入字串。例如:我先要判斷“HKLM SOFTWARE/nsis”這個key存不存在。
如果存在則寫入字串“DispName: nsis”,應該是用“WriteRegStr HKLM "SOFTWARE/nsis" "DispName" "nsis"”。如果不存在這個key,則不寫入注冊 表,繼續下面的安裝。
答:以下代碼實現:

復制代碼
代碼如下:

ReadRegStr $0 HKLM SOFTWARE/nsis ""
 IfErrors 0 +2
 Goto +2
WriteRegStr HKLM "SOFTWARE/nsis" "DispName" "nsis"

問:如何制作安裝包的時候需要調用系統函數來檢測當前安裝包運行的操作系統的內碼頁。
答:以下代碼顯示系統語言:

復制代碼
代碼如下:

System::Call "Kernel32::GetSystemDefaultLangID(v ..) i .s"
Pop $0
IntOp $0 $0 0xFFFF
MessageBox MB_OK $0

問:如何用NSIS注冊字體?
答:以下代碼:

復制代碼
代碼如下:

!include WinMessages.nsh
Section "MainSection" SEC01
File /oname=$FONTS/tahoma.ttf tahoma.ttf
Push "$FONTS/tahoma.ttf"
System::Call "Gdi32::AddFontResource(t s) i .s"
Pop $0
IntCmp $0 0 0 +2 +2
MessageBox MB_OK "注冊字體失敗"
SendMessage ${HWND_BROADcast} ${WM_FONTCHANGE} 0 0
SectionEnd

問:如何用 NSIS 安裝輸入法。
答:以下代碼:

復制代碼
代碼如下:

SetOutPath $SYSDIR
File WBIME.ime
Push "五筆輸入法"
Push "$SYSDIR/WBIME.ime"
System::Call "Imm32::ImmInstallIME(t s, t s) i .s"
System::Call "Imm32::ImmIsIME(i s) i .s"
Pop $0
IntCmp $0 1 0 +3 +3
MessageBox MB_OK "輸入法安裝成功"
Goto +2
MessageBox MB_OK "輸入法安裝失敗"

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av电影在线播放| 日韩av快播网址| 亚洲第一天堂无码专区| 亚洲精品视频二区| 国产成人精品久久亚洲高清不卡| 91精品国产91久久久久久| 国产精品电影在线观看| 精品一区二区三区电影| 91免费国产网站| 精品少妇一区二区30p| 久久久免费av| 亚洲丝袜av一区| 欧美高清自拍一区| 97超碰国产精品女人人人爽| 成人免费在线网址| 国产成人一区二区三区| 久久久精品一区二区三区| 亚洲国模精品私拍| 亚洲香蕉成人av网站在线观看| 国内精品久久久久影院 日本资源| 日韩av中文字幕在线免费观看| 欧美极品在线播放| 日韩电影中文字幕在线观看| 精品视频在线播放| 91久久精品视频| 欧美激情免费看| 亚洲影院高清在线| 国产精品夜色7777狼人| 成人久久一区二区三区| 亚洲精品美女视频| 成人国产精品一区二区| 九九久久久久久久久激情| 欧美xxxx14xxxxx性爽| 欧美国产中文字幕| 91精品国产综合久久男男| 日韩美女主播视频| 欧美亚洲成人网| 欧美另类xxx| 久久久久久亚洲精品| 欧美午夜性色大片在线观看| 欧美性猛交xxxx偷拍洗澡| 亚洲国产精品中文| 成人在线一区二区| 成人h片在线播放免费网站| 欧美精品一本久久男人的天堂| 欧美性生活大片免费观看网址| 欧美日产国产成人免费图片| 日韩电影中文字幕一区| 九九热视频这里只有精品| 久久久久久九九九| 国产视频丨精品|在线观看| 国产精品爱啪在线线免费观看| 91久久在线观看| 91精品国产91久久久久福利| 91香蕉嫩草神马影院在线观看| 狠狠色狠色综合曰曰| 一区三区二区视频| 日韩亚洲在线观看| 亚洲一区美女视频在线观看免费| 国产精品男人爽免费视频1| 91精品久久久久久久久中文字幕| 按摩亚洲人久久| 国产精品色午夜在线观看| 亚洲女人天堂av| 97国产suv精品一区二区62| 亚洲欧美国产视频| 欧美特黄级在线| 亚洲女同性videos| 91国内在线视频| 欧美多人乱p欧美4p久久| 欧美激情中文字幕在线| 国产xxx69麻豆国语对白| 亚洲男人的天堂在线播放| 欧美激情亚洲自拍| 欧美激情xxxx性bbbb| 欧美高清在线观看| 亚洲成年人在线| 精品久久久久久久久久| 最新国产成人av网站网址麻豆| 性金发美女69hd大尺寸| 日韩亚洲成人av在线| 不用播放器成人网| 国产日韩中文字幕| 亚洲综合大片69999| 亚洲韩国日本中文字幕| 亚洲欧美中文在线视频| 欧美日韩国产在线| 国产精品com| 中文字幕精品一区久久久久| 国产欧美日韩中文字幕在线| 欧美精品videofree1080p| 亚洲欧洲黄色网| 亚洲精品小视频| 国产视频亚洲精品| 欧美性极品xxxx做受| 亚洲偷欧美偷国内偷| 日本不卡高字幕在线2019| 亚洲精品久久久久久久久| 欧美大片在线免费观看| 久久天堂av综合合色| 欧美精品免费看| 中文字幕一区电影| 亚洲一区亚洲二区亚洲三区| 国产一区欧美二区三区| 欧美在线视频网站| 91精品久久久久久综合乱菊| 精品成人乱色一区二区| 96sao精品视频在线观看| 亚洲无亚洲人成网站77777| 97精品国产97久久久久久春色| 日本欧美中文字幕| 国产精品久久久av久久久| 国产精品久久久久久久一区探花| 日韩免费不卡av| 亚洲综合国产精品| 亚洲视频欧洲视频| 国产精品一香蕉国产线看观看| 国产美女久久精品香蕉69| 欧美综合一区第一页| 久久在线精品视频| 亚洲欧美国产制服动漫| 欧美精品久久久久久久久| 精品国产拍在线观看| 92福利视频午夜1000合集在线观看| 日韩精品视频在线观看网址| 欧美成人精品h版在线观看| 亚洲精品一区av在线播放| www.xxxx精品| 国内精品一区二区三区| 永久免费精品影视网站| 国内精品模特av私拍在线观看| 亚洲第一男人天堂| 蜜月aⅴ免费一区二区三区| 久久人人爽亚洲精品天堂| 亚洲欧美在线播放| 欧美性猛交xxxx富婆| 日韩美女免费视频| 欧美裸体视频网站| 日韩精品黄色网| 日本a级片电影一区二区| 亚洲日韩中文字幕| 国产欧美va欧美va香蕉在| 久久亚洲精品网站| 川上优av一区二区线观看| 国产精品白嫩美女在线观看| 欧美中文在线视频| 亚洲欧美第一页| 日韩电影中文字幕在线| 精品久久久久久中文字幕一区奶水| 亚洲免费高清视频| 亚洲精品短视频| 欧美性生交大片免费| 在线看日韩欧美| 国产美女精彩久久| 久久久精品国产网站| 亚洲日本成人网| 亚洲色图国产精品| 国产视频亚洲精品| 成人亚洲欧美一区二区三区| 欧美剧在线观看| 国产日本欧美视频| 中文字幕亚洲无线码a| 亚洲已满18点击进入在线看片| 亚洲黄页视频免费观看|