Показать полную графическую версию : [архив].: NSIS - все вопросы :.
wolkow70
06-05-2012, 20:45
Может кто-нибудь подсказать почему не работает вот это в деинсталляторе?
!define MUI_UNFINISHPAGE_NOAUTOCLOSE
И если так не правильно , то как тогда правильно сделать?
Мне нужна возможность в деталях просматривать процесс деинсталяции.
wolkow70
07-05-2012, 10:48
Может кто-нибудь подсказать почему не работает вот это в деинсталляторе?
!define MUI_UNFINISHPAGE_NOAUTOCLOSE »
Выяснил сам. Оказывается, что работает, нужно только в секции деинсталлятора убрать
SetAutoClose true
wolkow70
07-05-2012, 13:11
Товарищи, подскажите как в
MB_USERICON подставить другую иконку, а не инсталлятора?
kotkovets
07-05-2012, 14:55
Товарищи, подскажите как в
MB_USERICON подставить другую иконку, а не инсталлятора? »
Элементарно....
${MessageBoxEx} "путь к файлу ресурсу, где иконка" "текст надписи" "текст заголовка" "стиль сообщения" "индекс иконки" "код возврата"
!include "MUI2.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
OutFile "msgbox-setup.exe"
!ifndef MB_OK
!define MB_OK 0x00000000
!define MB_OKCANCEL 0x00000001
!define MB_ABORTRETRYIGNORE 0x00000002
!define MB_YESNOCANCEL 0x00000003
!define MB_YESNO 0x00000004
!define MB_RETRYCANCEL 0x00000005
!define MB_CANCELTRYCONTINUE 0x00000006
!define MB_ICONHAND 0x00000010
!define MB_ICONQUESTION 0x00000020
!define MB_ICONEXCLAMATION 0x00000030
!define MB_ICONASTERISK 0x00000040
!define MB_USERICON 0x00000080
!define MB_ICONWARNING ${MB_ICONEXCLAMATION}
!define MB_ICONERROR ${MB_ICONHAND}
!define MB_ICONINFORMATION ${MB_ICONASTERISK}
!define MB_ICONSTOP ${MB_ICONHAND}
!define MB_DEFBUTTON1 0x00000000
!define MB_DEFBUTTON2 0x00000100
!define MB_DEFBUTTON3 0x00000200
!define MB_DEFBUTTON4 0x00000300
!define MB_APPLMODAL 0x00000000
!define MB_SYSTEMMODAL 0x00001000
!define MB_TASKMODAL 0x00002000
!define MB_HELP 0x00004000
!define MB_NOFOCUS 0x00008000
!define MB_SETFOREGROUND 0x00010000
!define MB_DEFAULT_DESKTOP_ONLY 0x00020000
!define MB_TOPMOST 0x00040000
!define MB_RIGHT 0x00080000
!define MB_RTLREADING 0x00100000
!define IDABORT 3
!define IDCANCEL 2
!define IDCONTINUE 11
!define IDIGNORE 5
!define IDNO 7
!define IDOK 1
!define IDRETRY 4
!define IDTRYAGAIN 10
!define IDYES 6
!endif
!define MessageBoxEx "!insertmacro macro_MessageBoxIndirect"
!macro macro_MessageBoxIndirect Library lpszText lpszCaption dwStyle lpszIcon ExitCode
Push `${lpszText}`
Push `${lpszCaption}`
Push `${Library}`
Push `${dwStyle}`
Push `${lpszIcon}`
System::Store Sr1r2r3r4r5
System::Call 'kernel32::LoadLibrary(tr3)i.r0'
StrCmp $0 0 +5
System::Call '*(&l4, i$HWNDPARENT, ir0, tr5, tr4, i$2|${MB_USERICON}, ir1, i,k,i)i.r5'
System::Call 'user32::MessageBoxIndirect(ir5) i.s'
System::Call "kernel32::FreeLibrary(ir0)"
System::Free $5
StrCmp $0 0 0 +2
Push "error"
System::Store L
Pop `${ExitCode}`
!macroend
Section
${MessageBoxEx} "$SYSDIR\shell32.dll" "lpszText" "lpszCaption" "${MB_YESNOCANCEL}" "194" $1
${If} $1 == ${IDYES}
MessageBox MB_OK "Нажали кнопку `Да`"
${ElseIf} $1 == ${IDNO}
MessageBox MB_OK "Нажали кнопку `Heт`"
${ElseIf} $1 == ${IDCANCEL}
MessageBox MB_OK "Нажали кнопку `Отмена`"
${Else}
MessageBox MB_OK "$$1 = $1"
${EndIf}
SectionEnd
wolkow70
07-05-2012, 15:22
Элементарно.... »
Кому как. Мне с этим вряд ли разобраться.
Мне надо в сообщении типа этого просто иконку другую указать.
MessageBox MB_YESNO|MB_USERICON|MB_TOPMOST "Внимание!$\n\
$\nЕсли у вас открыты окна браузеров Internet Explorer, Mozilla Firefox,$\nOpera, Google Chrome закройте их перед продолжением установки. \
$\nВ противном случае, они будут закрыты принудительно! \
$\nЭто избавит от конфликтов интеграции программы. \
$\nПродолжить установку ${PRODUCT_NAME} ?" /SD IDYES IDYES continue IDNO close
;
close:
Abort
continue:
kotkovets
07-05-2012, 16:28
Кому как. Мне с этим вряд ли разобраться.
Мне надо в сообщении типа этого просто иконку другую указать. » ну так и указываете, хоть с исполняемого файла оперы.
${IfNot} ${Silent}
${MessageBoxEx} "$SYSDIR\shell32.dll" "lpszText" "lpszCaption" "${MB_YESNO}|${MB_TOPMOST}" "512" $1
${Else}
StrCpy $1 ${IDYES}
${EndIf}
${If} $1 == ${IDYES}
MessageBox MB_OK "Нажали кнопку `Да`"
${ElseIf} $1 == ${IDNO}
MessageBox MB_OK "Нажали кнопку `Heт`"
${EndIf}
wolkow70
10-05-2012, 13:42
Товарищи, может кто подскажет как на собственную страницу поместить просмотр текстового документа? Чего-то не получается:
Мне нужно, чтобы этот текстовый файл отображался с прокруткой.
И еще заголовок страницы поменять нужно, а то отображается от следующей страницы.
В функции вот что:
Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateLabel} 0 0 100% 12u "Вы можете ознакомиться с информацией об устанавливаемой программе"
Pop $Label
${NSD_CreateText} 0 13u 100% -13u "${pkgdir}\FlylinkDC++\readme_ru-RU.rtf"
Pop $Text
nsDialogs::Show
FunctionEnd
kotkovets
10-05-2012, 15:04
как на собственную страницу поместить просмотр текстового документа? »
Вот так:
!include "MUI2.nsh"
!include "FileFunc.nsh"
Page custom Help
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
InstallDir "$PROGRAMFILES\LICENSE"
OutFile "Basic.exe"
Var TextPage
Var Dialog
Var Label
!define LoadRTF "!insertmacro macro_LoadRTFfunc"
!define __NSD_RichEdit_CLASS "RichEdit20A"
!define __NSD_RichEdit_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_AUTOHSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}
!define __NSD_RichEdit_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}
!insertmacro __NSD_DefineControl RichEdit
!macro macro_LoadRTFfunc file hwnd
Push `${file}`
Push ${hwnd}
System::Store Sr0r1
SendMessage $0 1077 0 0x7fffffff
System::Get "(i, i.R0, i.R1, i.R2) iss"
Pop $2
System::Call "*(i 0, i 0, k r2) i .r3"
System::Call "user32::SendMessage(ir0, i1097, i2, ir3)i.s"
Pop $4
Push $4
ClearErrors
FileOpen $1 "$1" r
${Do}
Pop $0
${IfThen} "$0" != "$4" ${|}${Break}${|}
System::Call "kernel32::ReadFile(ir1, iR0, iR1, iR2, i0)"
Push 0
System::Call "$2"
${Loop}
FileClose $1
System::Free $3
System::Free $2
System::Store L
!macroend
Function Help
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateLabel} 0 0 100% 12u "Вы можете ознакомиться с информацией об устанавливаемой программе"
Pop $Label
${NSD_CreateRichEdit} 0 13u 100% 100% ""
Pop $TextPage
${LoadRTF} "$EXEDIR\test.rtf" $TextPage
nsDialogs::Show
FunctionEnd
Section "Main"
SectionEnd
wolkow70
10-05-2012, 15:38
kotkovets, Работает вариант, но не думал, что так сложно. Исходил из предположения, что в NSIS есть механизм чтения RTF - файлов (ведь текст лицензии он прокручивает).
wolkow70
10-05-2012, 17:25
kotkovets, Откопал на Ру-борде ваш старенький скрипт, который мне весьма помог:
http://forum.ru-board.com/topic.cgi?forum=5&topic=0595&start=1146&limit=1&m=1#1
Для меня полезным оказалось !insertmacro MUI_HEADER_TEXT_PAGE
Не мог понять как вставить заголовки на костомную страницу. Этот вариант сработал.
Набрёл случайно на вопрос, суть которого такова - "Как сделать так, чтобы кликнув на хелп-кнопочке (обозначенной знаком вопроса), рядом с каким либо элементом или надписью на странице - появлялось окно с сопроводительным текстом и, если надо, элементами управления ? Есть ли для этого какой либо плагин ?"
Оказывается есть такой (но его почему то нет в списке http://nsis.sourceforge.net/Category:Plugins)
Называется плагин nsWindows и живёт здесь :
http://forums.winamp.com/showthread.php?t=304431&highlight=nswindows
Только нагорожено в нём изрядно, а примеры мутные... Ежели бы этот плагин кто из специалистов "причесал" и упростил для поставленной задачи, то наверное была бы польза...
kotkovets
11-05-2012, 19:46
Только нагорожено в нём изрядно, а примеры мутные... »
этот плаг модифицированный nsDialogs - достойное и верное продолжение nsWindows.
но неинтересно ковыряться абсолютно!
wolkow70
12-05-2012, 14:33
kotkovets, может посоветуете как справиться с задачкой:
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "MyApp"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT ${PRODUCT_UNINST_ROOT_KEY}
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Icon Group"
На x86 все нормально. На системе X64 запись деинсталляции как и нужно создается в 64-битном реестре (через SetRegView 64), а значение "Icon Group" прописыается в 32-битный реестр. И как тут лучше сделать, учитывая, что путь к параметру задается через !define ?
kotkovets
12-05-2012, 15:15
wolkow70, обычной записью в реестре и чтением значение параметра деинсталятором.
wolkow70
12-05-2012, 15:48
wolkow70, обычной записью в реестре и чтением значение параметра деинсталятором. »
Тогда мне непонятно, как это будет выглядеть в контексте работы макроса
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
И в деинсталляторе:
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
Можно ли переназначать
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
в зависимости от разрядности системы, может в Function .onInit как то ?
kotkovets
12-05-2012, 18:49
Можно ли переназначать
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
в зависимости от разрядности системы, может в Function .onInit как то ? »
константы нет - это время компиляции. Для этого есть переменные - в любом месте кода.
wolkow70
13-05-2012, 09:55
Для этого есть переменные - в любом месте кода. »
Не получается:
Function .onInit
${If} ${RunningX64}
SetRegView 64
StrCpy $PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
StrCpy $PRODUCT_UNINST_ROOT_KEY "HKLM"
SetRegView 32
${Else}
StrCpy $PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
StrCpy $PRODUCT_UNINST_ROOT_KEY "HKLM"
${EndIf}
FunctionEnd
при этом закоментировал:
;!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
;!define PRODUCT_UNINST_ROOT_KEY "HKLM"
При копиляции ошибка в строках:
Usage: ReadRegStr $(user_var: output) rootkey subkey entry
root_key=(HKCR|HKLM|HKCU|HKU|HKCC|HKDD|HKPD|SHCTX)
Error in macro MUI_FUNCTION_STARTMENUPAGE on macroline 12
Error in macro MUI_PAGEDECLARATION_STARTMENU on macroline 30
Error in macro MUI_PAGE_STARTMENU on macroline 6
kotkovets
13-05-2012, 10:31
wolkow70, StrCpy $PRODUCT_UNINST_ROOT_KEY "HKLM" »
и не принимают команды работы с реестром: переменную как ветку :confused:
а зачем трогать, коль ветка неизменна и значения переменных не изменяются, тупо!
да еще в функции .OnInit сразу переключаться в 32-разряд :)
я же говорил, непосредственно перед записью самым обычным способом, переключать вид реестра.
wolkow70
13-05-2012, 11:13
я же говорил, непосредственно перед записью самым обычным способом, переключать вид реестра. »
Перед какой записью то? Запись идет подключением макроса:
Section "Создать ярлыки в меню Пуск" StartMenu
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PRODUCT_NAME}.lnk" "$INSTDIR\MyApp.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
И значение $StartMenuFolder заведомо не известно.
Перед макросом что-ли ставить SetRegView 64 ?
kotkovets
13-05-2012, 11:29
wolkow70, вроде бы по русскому говорю...
Перед макросом что-ли ставить SetRegView 64 ? »
ну тут же очевидно, идет запись в реестр, сам макрос MUI_STARTMENU_WRITE_END
!macro MUI_STARTMENU_WRITE_END
!verbose push
!verbose ${MUI_VERBOSE}
!ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME
;Write folder to registry
WriteRegStr "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}"
!endif
${endif}
!undef MUI_STARTMENUPAGE_CURRENT_ID
!verbose pop
!macroend
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC