PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 [135] 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

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
Не мог понять как вставить заголовки на костомную страницу. Этот вариант сработал.

MKN
11-05-2012, 17:31
Набрёл случайно на вопрос, суть которого такова - "Как сделать так, чтобы кликнув на хелп-кнопочке (обозначенной знаком вопроса), рядом с каким либо элементом или надписью на странице - появлялось окно с сопроводительным текстом и, если надо, элементами управления ? Есть ли для этого какой либо плагин ?"
Оказывается есть такой (но его почему то нет в списке 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