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

kotkovets
22-04-2011, 17:27
А более простые вещи меня уже не интересуют »
да говорил про AIMP, при условии, что разберетесь. С простых вещей все сложное состоит.
все работает, кроме открытия файлов двойным щелчком »
у меня нормально, как положено работает, а что там делает оффициальная - там тоже куча ошибок(полный бардак с ассоциациями), поэтому переделываю себе именно так, как нужно им делать, а то они паканули, а ты разбирайся, че там за порнуха..

wolkow70
23-04-2011, 08:26
kotkovets,

Прописал так в секции удаления:

TASKKILL /F /IM explorer.exe
RMDir /r "$INSTDIR\"
${RefreshShellIcons}
SetAutoClose true
SectionEnd

Пишет, что инвалидная комманда.

С плагином тоже не получается, поместил его в папку с плагинами (Unicod версия)

прописал:

nsRestartExplorer::nsRestartExplorer restart infinite
;nsRestartExplorer::nsRestartExplorer start ignore
;nsRestartExplorer::nsRestartExplorer quit 1000
Pop $1
DetailPrint $1
RMDir /r "$INSTDIR\"
${RefreshShellIcons}
SetAutoClose true
SectionEnd

Тоже не перегружает оболочку...

wolkow70
23-04-2011, 11:50
Тоже не перегружает оболочку... »
Поменял версию плагина Unicod на Ansi, оболочка стала перезагружаться.

Комманду пробовал прописать так:
ExecWait `taskkill /F /IM explorer.exe`
Работает, но просто вырубает эксплорер...

kotkovets
23-04-2011, 13:49
wolkow70,
Вспомнил, как я делал - это как один из вариантов, для экспериментов тут широкое поле
Section Uninstall
nsProcess::_KillProcess "explorer.exe"
Pop $0
DetailPrint "KillProcess: [ $0 ]"
nsProcess::_FindProcess "explorer.exe" ;если не завелся проводник
Pop $0 ;если не найден explorer, то стека в $0 возвращается 603
DetailPrint "FindProcess: [ $0 ]"
StrCmp $0 603 0 +2
Exec "explorer.exe" ;заводим проводник
nsProcess::_Unload
Sleep 500 ;пауза - иногда нужно
;здесь команды удаления
SectionEnd
Насчет юникода - половина плагинов просто не работает, или работает с ошибками.
http://nsis.sourceforge.net/NsProcess_plugin

kotkovets
23-04-2011, 16:27
Вот еще попроще "железный вариант" хоть для юникода или анси

Section Main
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit code: [ $0 ]" ; для иллюстрации код возврата
Sleep 500 ;пауза - если нужно
StrCmp $0 0 0 +2
Exec "explorer.exe"
SectionEnd

wolkow70
24-04-2011, 07:58
kotkovets,

nsProcess::_KillProcess "explorer.exe"
Пишет инвалидная комманда. Плагин Process поставил...

kotkovets
24-04-2011, 11:11
Плагин Process поставил.. »
а это че такое? а что то говорил про плагин Process ????
http://nsis.sourceforge.net/NsProcess_plugin - что уже не катит и не работает?
Могу скрипт и выложить чисто на вызовах WinAPI....
а само лучше внимательно читать, кругозор расширяет...

wolkow70
24-04-2011, 11:39
Section Main
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500 ;пауза - если нужно
StrCmp $0 0 0 +2
Exec "explorer.exe"
SectionEnd »
Этот вариант железно работает. Я его в отдельную подсекцию выделил. Как альтернативу перезагрузки компа. Интересно получилось.


Function un.onInit
SectionSetText ${sec09} "Удалить Light Alloy"
FunctionEnd

Section Uninstall sec09
SectionIn 1 RO
KillProcDLL::KillProc "LA.exe"
Sleep 700
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED "$INSTDIR\ContextMenu.dll"

бла-бла-бла

Delete /REBOOTOK "$INSTDIR\ContextMenu.dll"
RMDir /r "$INSTDIR\"
${RefreshShellIcons}
SetAutoClose true
SectionEnd

Section /o "Un.Перезагрузка Проводника" sec12
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500 ;пауза - если нужно
StrCmp $0 0 0 +2
Exec "explorer.exe"
RMDir /r "$INSTDIR\"
SectionEnd

LangString DESC_09 ${LANG_RUSSIAN} "Программа LightAlloy будет удалена с Вашего компьютера"
LangString DESC_10 ${LANG_RUSSIAN} "Внимание, все настройки LightAlloy будут удалены с компьютера"
LangString DESC_11 ${LANG_RUSSIAN} "При удалении LightAlloy будет произведена ассоциация медиафайлов с Windows Media Player"
LangString DESC_12 ${LANG_RUSSIAN} "Перезагрузить Проводник Windows вместо перезагрузки компьютера"

Kelinmiir
25-04-2011, 08:33
Доброго времени суток!

Имеется программа и несколько баз данных (БД) для нее, сейчас с помощью NSIS я создаю инсталятор в котором совмещены сама программа и БД, а в процессе установки появляется меню в котором можно выбрать какие БД нужно установить. Вопрос: как разделить инсталятор, чтобы в самом инсталяторе находилась только программа, а БД находились гденибудь рядом, но при этом процесс установки остался неизменным (запускаем инсталятор, появляется меню с выбором БД и все успешно инсталируется).

Krinkels
25-04-2011, 09:38
А ты запихни БД в архивы(например cab или 7zip). Потом делаешь выбор БД на странице компонентов, и в зависимости от выбора распаковываешь ту или иную базу данных.

yyv
25-04-2011, 12:16
Здравствуйте
Уже мозг сломал, пока ничего не могу придумать, Может вы что подскажете.
Есть такая задача.
Регулярно создается большое количество инсталлеров. Некоторые могут отличаться сильно по секциям и страницам, а в некоторый отличие только в значении переменных.
к примеру отличаються только названием программы и описанием
define PRODUCT_NAME "name test"
переменные задаются при генерации скрипта через ключ /D.
Стал вопрос можно ли на этот тип инсталлеров сделать один типовой а остальные данные брать из вне при установке программы. скажем читать черз ini файл?
пробовал в функции .onInit вызвать другую функцию
и прочитать эти данные
ReadINIStr $R1 "$TEMP\settings.ini" "PRODUCT_NAME" "Text"
!undef PRODUCT_NAME
!define PRODUCT_NAME $R1

но это работает не так как надо
значение переменной вроде заменяться
MessageBox MB_OK|MB_ICONSTOP "${PRODUCT_NAME}"
выводит именно то значение что прописано в settings.ini
но на страницах где должно отображаться PRODUCT_NAME отображается 0.
реально ли выполнить задачу под эти требования?
если да буду раз советам
с ув. Ярослав

Krinkels
25-04-2011, 12:48
yyv
Не думаю что такое возможно, хотя подождем, что скажет на это гуру kotkovets
А вообще, ИМХО, в таких случаях проще все константы которые нужно изменить запихнуть в отдельный файл и там их изменять.

kotkovets
25-04-2011, 13:46
yyv,
Можно сделать примерно так (пример на этапе инсталляции):
1. Команды не в коем случае не перемещать - здесь очень важна последовательность действий!
2. Константы иницилизируем, только в функции OnInit, потом будет поздно и значения констант определяем только после отработки макроса PRODUCTNAME и следовательно, объявляем значения констант после макроса - банальная последовательность действий
3. Это извращение, проще хранить значения в переменных. причем в данном случае в объявленных переменных, может быть покажу, когда именно, в какой момент нужно делать - здесь вся загвоздка.

!include "MUI2.nsh"
!include "Logiclib.nsh"

OutFile file.exe

!macro PRODUCTNAME
ReadINIStr $R1 "$EXEDIR\settings.ini" "PRODUCT_NAME" "Text"
${IfNot} $R1 == ""
StrCpy $R1 "$R1"
${Else}
ClearErrors
StrCpy $R1 "это NSIS ${NSIS_VERSION}" ;если $R1 = "пустому значению", то назначаем по умолчанию значение
${EndIf}
!macroend

!define MUI_WELCOMEPAGE_TITLE "$R1"
!define PRODUCT_NAME "$R1"
Caption "$R1"

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show

Function .OnInit
!insertmacro PRODUCTNAME
FunctionEnd

Section ""
MessageBox MB_ICONINFORMATION|MB_OK ${PRODUCT_NAME}$\n$\r$R1
SectionEnd

yyv
26-04-2011, 11:43
спасибо это вроде работает.
надо будет еще тестировать

Это извращение, проще хранить значения в переменных. причем в данном случае в объявленных переменных, может быть покажу, когда именно, в какой момент нужно делать - здесь вся загвоздка. »
я понимаю что это извращение , но первоначальный код писал не я и там во все коде очень много завязано на этих константах.
там перед фунцией
идет куча проверок
типа


!ifdef AFTERDOWNLOAD Page custom customPageAfterdownload !endif
т.е. в зависимости от того есть или нет константа показывать или нет страницу.

из за этого получается много инсталеров.
вот решили попробовать сделать один а странницы показывать или нет с ини файлика вытягивать данные

kotkovets
26-04-2011, 13:06
надо будет еще тестировать »
тестируйте. а в самый лучший вариант изменения всех страниц, делать в функциях во время открытия страниц, по различным условиям - будь это запуск с ключом /G и так далее, я так делаю и без проблем!эти функции можно узнать в Справочнике по NSIS (http://forum.oszone.net/showpost.php?p=1569008) (стандартные функции в MUI) или в оригинальной справке. Если не разберетесь - я вам пример приведу.

wolkow70
26-04-2011, 17:15
kotkovets,
Подскажите, плиз, что нужно добавить в данный макрос, что бы в контекстном меню файлов появилось Открыть в FastStone Image Viewer.

!macro RegisterExtension extenstion ContentType PerceivedType ClassName DefaultIcon OpenCommand

WriteRegStr HKCR "${extenstion}" "" "${ClassName}"
WriteRegStr HKCR "${extenstion}" "PerceivedType" "${PerceivedType}"
WriteRegStr HKCR "${extenstion}" "Content Type" "${ContentType}"
WriteRegStr HKCR "${ClassName}\DefaultIcon" "" "${DefaultIcon}"
WriteRegStr HKCR "${ClassName}\shell\open\command" "" "${OpenCommand}"
!macroend


Пробовал сам добавить таким макаром:

var CommandName


!macro RegisterExtension extenstion ContentType PerceivedType ClassName DefaultIcon OpenCommand CommandName

WriteRegStr HKCR "$ClassName\shell\open" "" "CommandName"

StrCpy $CommandName "Открыть в FastStone Image Viewer"

!insertmacro RegisterExtension ".bmp" "image/bmp" "image" "FastStone.bmp" "$OUTDIR\FSIcons.db,0" $OpenCommand $CommandName


Не работает вариант!

kotkovets
26-04-2011, 18:17
wolkow70
Две строчки кода и никаких гвоздей! на примере Reg2Nsis
Section
WriteRegStr HKLM "SOFTWARE\Classes\regfile\shell\Reg2Nsis" "" "&Convert to nsis script"
WriteRegStr HKLM "SOFTWARE\Classes\regfile\shell\Reg2Nsis\command" "" "$\"${NSISDIR}\reg2nsis.exe$\" $\"%1$\" -O"
SectionEnd

wolkow70
26-04-2011, 18:27
Две строчки кода и никаких гвоздей! на примере Reg2Nsis »
Это придется на каждое расширение делать. Мне именно макрос нужно поправить.

Сейчас попробовал применить другой макрос, сделал так:


!macro RegisterExtension extenstion
StrCpy $ClassName "FastStone.${extenstion}"
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"
WriteRegStr HKCR "$ClassName\shell\open" "" "Открыть в FastStone Image Viewer"
WriteRegStr HKCR "$ClassName\shell\open\command" "" "$OpenCommand"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"

${Switch} ${extenstion}
${Case} "BMP"
StrCpy $IconIndex 0
WriteRegStr HKCR "$ClassName" "" "FastStone BMP File"
${Break}
${Case} "PNG"
StrCpy $IconIndex 7
WriteRegStr HKCR "$ClassName" "" "FastStone PNG File"
${Break}
${Case} "JPG"
StrCpy $IconIndex 4
WriteRegStr HKCR "$ClassName" "" "FastStone JPG File"
${Break}
${EndSwitch}
WriteRegStr HKCR "$ClassName\DefaultIcon" "" "$IconFile,$IconIndex"
EndMacro:
!macroend

Section "!${PRODUCT_NAME}" sec01
бла-бла
StrCpy $OpenCommand "$\"$OUTDIR\FSViewer.exe$\" $\"%1$\""
StrCpy $IconFile "$INSTDIR\FSIcons.db"

SectionGroup "Ассоциация файлов" Sec06
;
Section "BMP" BMP
SectionIn 1 2
!insertmacro RegisterExtension ".bmp"
SectionEnd

Section "JPG" JPG
SectionIn 1 2
!insertmacro RegisterExtension ".jpg"
SectionEnd

Почему то в реестре расширения регистрируются с двумя точками
..bmp
..jpg
и т.д

wolkow70
26-04-2011, 19:16
Почему то в реестре расширения регистрируются с двумя точками
..bmp
..jpg
и т.д »


Разобрался, все пока получается....!!!!!

punsh
01-05-2011, 13:56
WriteRegStr HKLM "SOFTWARE\BurnAware\Install" "InstallEntry" "?"

как прописать выше этой строчки, чтобы заместь "?" было полное имя компьютера из HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"




© OSzone.net 2001-2012