Войти

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


Страниц : 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

MKN
09-02-2013, 10:57
andryz80,
Про всё уже не раз сказано и приведены примеры. См. 1 часть темы.

Lex_from_Belarus
09-02-2013, 12:53
А кто-нибудь знает как запустить файл установки во время установки моего установщика в режиме совместимости Win7 (просто прога не устанавливается просто так на Win8, а врежиме совместимости всё OK)
Надо использовать, а вот с каким параметром не знаю.
ExecWait '"$INSTDIR\someprogram.exe"' $0

MKN
09-02-2013, 13:40
Lex_from_Belarus,
Не знаю как в W8, а в W7 параметры совместимости устанавливаются в
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
Может попробовать перед запуском, сначала туда "прописывать" программу-установщик ?

andryz80
09-02-2013, 17:52
покопался на форуме нарыл вот SetShellVarContext all добавил



SetShellVarContext all
Delete "$SMPROGRAMS\Sprint Layout 6\Uninstall.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Website.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Help.lnk"
Delete "$DESKTOP\Sprint Layout.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Sprint Layout.lnk"
RMDir /r "$SMPROGRAMS\Sprint Layout 6"
RMDir /r "$INSTDIR"



все удаляется кроме папки RMDir /r "$SMPROGRAMS\Sprint Layout 6" не работает. может кто в курсе?

а вот как регить ассоциации не нашел. точнее не нашел универсального средства, что бы для ХР или семерки или 64разрядных работало и там и там

помогите. или хотя бы носом мокните где почитать.
ведь тому, кто ориентируется легче дать наводку. а я новичок и не ориентируюсь пока еще. сорри

andryz80
09-02-2013, 23:31
вот нашел регистрацию расширений но много чего не понятно.
можете кто нибудь прокомментировать что за записи в реестр делает макрос?

!macro RegisterExtension extenstion
WriteRegStr HKCR ".${extenstion}" "" "Winamp.File"

WriteRegStr HKCR "Winamp.File" "" "Winamp Media File" ;я так понял тут прописывается описание типа файла
WriteRegStr HKCR "Winamp.File\DefaultIcon" "" "$INSTDIR\winamp.exe,1" ;путь к иконке
WriteRegStr HKLM "Winamp.File\shell" "" "Play" ; а вот что тут и дальше я не прнимаю
WriteRegStr HKLM "Winamp.File\shell\Play" "" "&Play in Winamp"
WriteRegStr HKCR "Winamp.File\shell\Play\command" "" "$\"$INSTDIR\winamp.exe$\" $\"%1$\""
WriteRegStr HKCR "Winamp.File\shell\open\command" "" "$\"$INSTDIR\winamp.exe$\" $\"%1$\""
WriteRegStr HKLM "Winamp.File\shell\ListBookmark" "" "Add to Winamp's &Bookmark list"
WriteRegStr HKLM "Winamp.File\shell\ListBookmark\command" "" "$\"$INSTDIR\winamp.exe$\"/BOOKMARK $\"%1$\""
WriteRegStr HKLM "Winamp.File\shell\Enqueue" "" "&Enqueue in Winamp"
WriteRegStr HKLM "Winamp.File\shell\Enqueue\command" "" "$\"$INSTDIR\winamp.exe$\"/ADD $\"%1$\""
!macroend

дальше я понимаю, что вызывается макрос и ему передается параметр расширение


Section "Программа" SEC01
...
!insertmacro RegisterExtension MP3
!insertmacro RegisterExtension MP2
!insertmacro RegisterExtension MP1
!insertmacro RegisterExtension OGG
!insertmacro RegisterExtension WAV
...
SectionEnd

и еще как при деинсталяции удалять ассоциацию?

Awral
10-02-2013, 00:13
Помогите мне пожалуйста загрузить текст из rtf файла. Суть:
1. При компиляции к инсталлятору подключается rtf файл с текстом
2. При запуске инсталлятора из этого файла читается содержимое и выводится в Label.
Суть такая же, как и с окном лицензии. Это возможно реализовать? Заранее спасибо.

kotkovets
10-02-2013, 13:08
Помогите мне пожалуйста загрузить текст из rtf файла»
При запуске инсталлятора из этого файла читается содержимое и выводится в Label. »
Ну какой черт здесь label ? хрень всякую несете.. не понимая, что для чего..
нужно создавать контрол RichEdit20A
!include "MUI2.nsh"
!include "LoadRTF.nsh"
outfile test.exe

Page custom funcrtfreade
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

var dlg
var RichDesc

Function funcrtfreade
nsDialogs::Create 1018
Pop $dlg
nsDialogs::CreateControl "RichEdit20A" ${ES_READONLY}|${DEFAULT_STYLES}|${WS_TABSTOP}|\
${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN} ${WS_EX_STATICEDGE} \
0 0 100% 75% ''

pop $RichDesc
${LoadRTF} "$EXEDIR\test.rtf" $RichDesc
nsDialogs::Show
FunctionEnd

Section
SectionEnd
примеров до хрена (http://nsis.sourceforge.net/LoadRTF)

MKN
10-02-2013, 18:24
помогите. или хотя бы носом мокните где почитать. »
Информации полно, только погугли... Рассказ про ассоциирование файлов не возможен без теории.
Вот немного основной информации :

О файловых ассоциациях

Файловые ассоциации контролируют такую функциональность:
Какое приложение будет запущено, когда пользователь дважды щёлкает по файлу.
Какая иконка показывается для файлов этого типа.
Как файловый тип показывается в Проводнике Windows.
Какие команды показываются в контекстном меню файлов этого типа.
Другие возможности пользовательского интерфейса, типа всплывающих подсказок, деталей для подробного и табличного режимов просмотра.

Раздел HKEY_CLASSES_ROOT является точной копией раздела HKEY_ LOCAL_MACHINE\SOFTWARE\Classes и содержит в себе информацию о всех зарегистрированных в системе типах файлов. Именно из этого раздела берется информация для представления в окне "Типы файлов".
Если вы создадите новый ключ в HKCR, то Windows создаст его в разделе HKLM\SOFTWARE\Classes. Другими словами, будет создана общесистемная ассоциация файла.
Если вы хотите создать пользовательскую ассоциацию, то ее нужно явно создавать в разделе HKCU\SOFTWARE\Classes.

Вначале в разделе HKEY_CLASSES_ROOT идет список всех расширений (с точками вначале!), зарегистрированных в системе, каждое из которых является названием раздела реестра. В каждом таком подразделе обязательно есть параметр "По умолчанию". В нем записано как бы "внутреннее" название расширения, которое "в ходу" у системы.

В разделе HKEY_CLASSES_ROOT также присутствует раздел с именем этого внутреннего названия расширения (расположенный ниже в окне Редактора реестра), в котором находятся параметры, определяющие контекстное меню правой кнопки мыши этого расширения. В параметре "По умолчанию" этого раздела записано "официальное" название типа файлов с таким расширением, которое, например, присутствует в списке окна "Типы файлов".

В разделе, имя которого соответствует расширению с точкой вначале, также могут находиться различные ключи, определяющие интеграцию данного типа файлов в Проводник.
В частности, если создать здесь раздел с именем, соответствующим внутреннему названию расширения, а в нем - раздел с именем ShellNew со строковым параметром NullFile, то в выпадающий список "Создать" будет помещено "официальное" название типа файлов. При выборе в списке этого типа будет создан пустой файл с расширением, соответствующим этому названию.

Если в папку Windows\ShellNew поместить файл с этим расширением, а в разделе ShellNew создать не параметр NullFile, а параметр FileName и в его значении указать имя этого файла, то при выборе этого типа файлов в списке "Создать" в текущей папке будет создана копия файла, помещенного в папку Windows\ShellNew.

В разделе с именем "внутреннего" названия расширения могут находиться разделы DefaultIcon, параметр которого "По умолчанию" определяет иконку этого типа файлов
и shell, в котором располагаются команды контекстного меню правой кнопки мыши данного типа файлов. Название действия, которое отображается в контекстном меню, может быть либо названием подраздела раздела shell, либо значением параметра "По умолчанию" этого подраздела (в последнем случае название самого подраздела не имеет значения).

В разделе с именем команды контекстного меню располагается подраздел command .
В параметре "По умолчанию" там указан полный путь к программе, которая должна выполнить данное действие.

Установка необязательных подключей и атрибутов расширения файла :

Записи расширений типов файлов в реестре имеют несколько опциональных подключей и атрибутов. Все значения имеют тип REG_SZ.

Content Type тип содержимого MIME этого типа файла.

OpenWithList Этот подключ содержит одно или несколько приложений, которые появляются в диалоговом окне "Открыть с помощью" для файлового типа.

OpenWithProgids Этот подключ содержит список альтернативных ProgID для этого типа файла. Программы с этими ProgID также появляются в диалоге "Открыть с помощью". Когда приложение берёт контроль над типом файла, меняя значение по-умолчанию, оно также должно занести себя в этот список.

PerceivedType Принадлежность к категории для типов файлов. Например - image, audio, document и т.д.


Регистрация типа файла

Оболочка использует подключи реестра программных идентификаторов (programatic identifier или ProgID), чтобы ассоциировать тип файла с приложением, и чтобы контролировать поведение ассоциации.
Записи ProgID, используемые для файловых ассоциаций, хранятся в ключе реестра HKEY_CLASSES_ROOT.

Чтобы ассоциировать тип файла с существующим приложением, найдите ProgID этого приложения в реестре.
Если вы планируете ассоциировать один или более типов файлов с новым приложением, то вы обязаны создать новый ProgID для каждого типа файлов, который вы хотите ассоциировать с приложением.
Некоторые файловые типы имеют много расширений, указывающий на один ProgID. Например:

HKEY_CLASSES_ROOT\App.jpeg (ваш ProgID)
HKEY_CLASSES_ROOT\.jpg = App.jpeg (проецирование расширения на ProgID)
HKEY_CLASSES_ROOT\.jpeg = App.jpeg (проецирование второго расширения на тот же ProgID)

Правильный формат ProgID является таким [Поставщик или приложение].[Компонент].[Версия] - три части, соединённые точками, без пробелов, например: Word.Document.6. Часть [Версия] является необязательной, но рекомендуемой.

Подключ ProgID должен включать следующие элементы :
(Default) - значение по-умолчанию для ProgID в название формата файлов для этого ProgID, пригодное для показа пользователю. Это поле устарело в Windows 2000 и выше. Вместо него следует использовать значение FriendlyName
Тем не менее, вы должны установить это поле для совместимости со старыми программами. Для согласованности - здесь должны быть те же данные, что и в поле FriendlyName

FriendlyTypeName - Название типа файлов (friendly name) этого ProgID, пригодного к показу пользователю. Для согласованности - здесь должны быть те же данные, что и в значении по-умолчанию (см. выше).

InfoTip - краткое описание, которое Оболочка будет показывать для этого ProgID. Запись InfoTip показывается, когда пользователь задерживает мышь над файлом этого типа.

DefaultIcon - иконка по-умолчанию, для файловых типов, ассоциированных с этим ProgID. Это значение может быть либо REG_SZ, либо REG_EXPAND_SZ, но оно должно иметь формат полного имени файла со значением ресурса через запятую, например: %SystemRoot%\shell32.dll,-154.

Но и это далеко не всё... Для полного счастья при ассоциировании надо также чтобы :
Приложение, которое устанавливается для всех пользователей компьютера, было зарегистрировано под ключом реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths.
В Windows 7 и выше, приложение также может быть установлено только для одного пользователя регистрацией в ключе реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths.

Записи под ключом App Paths в основном используются для таких целей:
Чтобы указать соответствие между именем исполняемого файла приложения и полным путём к приложению.
Чтобы добавлять информацию к переменной окружения PATH индивидуально для приложения и процесса.

Также в реестре создаётся ключ с списком нужных ассоциаций :
[HKEY_LOCAL_MACHINE\SOFTWARE\ACD Systems\App\Capabilities\FileAssociations]
и регистрации ассоциаций для приложения :
[HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications]
"App"="Software\\App\\Capabilities"

В Windows 7 для ассоциирования важен ключ :
HKEY_CURRENT_USER "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "ProgId" "App.${extenstion}"

А ещё бывают востребованы параметры для обработки событий для типов файлов, для индексации типов файлов и пр....

В Windows 8 обстановка с ассоциированием ещё круче...
В Windows 8 программы не могут сами изменять ассоциации для типов файлов, которые уже связаны с другими программами! Это верно как при установке программы, так и впоследствии, однако в обоих случаях работает сопоставление с незанятыми типами файлов.
http://feedproxy.google.com/~r/outsidethebox/windows-8/~3/ZER2_GwZjOU/
Хотя не всё так уныло, как описано в статье. Некоторые программы успешно справляются с ассоциированием файлов при установке, не смотря на то что "их" тип файлов, по умолчанию уже занят системой. Например, AdobeReader.

andryz80
10-02-2013, 23:13
ужасс как все запутаноо. а может есть кусок универсального кода?

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


а по поводу почему папка не удаляется никто не поможет?

MKN
11-02-2013, 11:06
ужасс как все запутаноо »
Для твоего случая всё гораздо проще. Достаточно так :


!include "x64.nsh"
OutFile "LayAss.exe"
InstallDir "$PROGRAMFILES\Sprint-Layout 6 Setup"
;RequestExecutionLevel admin

Function .onInit
${If} ${RunningX64}
SetRegView 32
${EndIf}
FunctionEnd

Section
WriteRegStr HKLM "SOFTWARE\Classes\.lay" "" "Layout.File.6"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6" "" "Редактор печатных плат"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\DefaultIcon" "" "$INSTDIR\lay.ico"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell" "" "open"
WriteRegStr HKLM "SOFTWARE\Classes\Layout.File.6\shell\Open\command" "" "$\"$INSTDIR\layout 6.0.exe$\" $\"%1$\""
WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\EXTENSIONS" "lay" "$\"$\"$INSTDIR\layout 6.0.exe$\" ^.lay$\""
SectionEnd

Иконку lay.ico, помести в папку с прогой (или куда угодно, подкорректировав путь), обрати внимание на имя папки установки, в разных вариантах дистр-вов может быть по разному... Проверял на W7x64
а по поводу почему папка не удаляется никто не поможет? »
Папка твоя со всем содержимым (и зачем по очереди удалять из неё ярлыки ?) , просто обязана удалиться :
Section Uninstall
SetShellVarContext all
RMDir /r "$SMPROGRAMS\Sprint Layout 6"
SectionEnd
если нет ошибки в коде или не начудил с правами....

DruOleg
11-02-2013, 14:31
Прошу помочь с ведением лога установки.

Для записи в лог использую плагин:
http://nsis.sourceforge.net/NSISLog_plug-in
С ним все ок.

Но стоит вопрос записи времени каждого действия:

14-12-2012 13:56:43 Наличие fbclient.dll - Ok
14-12-2012 13:56:44 Наличие gbak.exe - Ok
14-12-2012 13:56:45 Наличие IBEScript.exe - Ok
14-12-2012 13:56:46 Проверка Firebird .NET Data Provider 2.0.1 - Ok
14-12-2012 13:56:47 Проверка FoxPro OLE DB Provider - есть


Использую плагин:
http://nsis.sourceforge.net/Time_plug-in

nsislog::log "$LogFileWay" ""
${time::GetLocalTime} $0
nsislog::log "$LogFileWay" "$0 ********************"
${time::GetLocalTime} $0
nsislog::log "$LogFileWay" "$0 ****** Запуск ******"

Очень неудобно каждый раз писать в переменную и потом выводить...
Может есть какое то более универсальное решение?

K.A.V.
11-02-2013, 14:49
DruOleg, в справочнике не смотрели страничку по пути "Примеры кодов => LOG-файл установки"?
В тот метод можно прикрутить время

DruOleg
11-02-2013, 14:52
DruOleg, в справочнике не смотрели страничку по пути "Примеры кодов => LOG-файл установки"?
В тот метод можно прикрутить время »
Мне не подошел этот метод. Поэтому использую плагин.

profcom
11-02-2013, 14:55
Прошу помочь найти ошибку версия nsis ANSI. Ошибка заключалась в необходимой инициализации перед вызовом функции.
System::Alloc 64 # (4+4+8+8+8+8+8+8+8=64 байта) # выделяем буфер
Pop $1 # определяем адрес выделенного буфера
System::Call "*$1(i64)" # инициализация структуры
System::Call "Kernel32::GlobalMemoryStatusEx(ir1)"
System::Call "*$1(i.r2, i.r3, l.r4, l.r5, l.r6, l.r7, l.r8, l.r9, l.r10)" # считываем данные со структуры
System::Free $1 # освобождаем буфер

K.A.V.
11-02-2013, 15:01
Мне не подошел этот метод. Поэтому использую плагин. »
1. Тогда объясните причину, почему не подошел?
2. Вы сами прописываете ручками в коде, какие данные занести в LOG файл и плагин просто прописывает текст в файл по указанию переменной?

profcom
11-02-2013, 15:04
Очень неудобно каждый раз писать в переменную и потом выводить...
Может есть какое то более универсальное решение? »
Есть универсальное решение и называется оно макросы, если не хочешь что то писать много раз напиши один раз макрос и вставь вначале кода. Пример:

!macro Log _msg
${time::GetLocalTime} $0
nsislog::log "$LogFileWay" "$0 ${_msg}"
!macroend
!define Log "!insertmacro Log"

Section
${Log} "********************"
${Log} "****** Запуск ******"
SectionEnd

DruOleg
11-02-2013, 15:37
1. Тогда объясните причину, почему не подошел?
2. Вы сами прописываете ручками в коде, какие данные занести в LOG файл и плагин просто прописывает текст в файл по указанию переменной? »
1. Мне показалось, что его слишком сложно подключать - добавлять простыню кода в конец рабочего файла. Это может вызвать путаницу.
2. Да, это основной аргумент - пишу в лог только то, что мне нужно.

Lex_from_Belarus
11-02-2013, 16:38
Подскажите пожалуйста, а на основании этого лога можно сделать Uninstall. Ну проще говоря, при установке есть 20 компонентов, устанавливается допустим из них штук 15. Потом при удалении хотелось бы сделать возможность удалить допустим 10, т.е. должно остаться 5 штук. Или есть проще вариант. Вариант с прописыванием файлов вручную не вариант, т.к. файлов в каждом компоненте много и они пересекаются в одних и тех же папках.

profcom
11-02-2013, 17:13
Подскажите пожалуйста, а на основании этого лога можно сделать Uninstall. Ну проще говоря, при установке есть 20 компонентов, устанавливается допустим из них штук 15. Потом при удалении хотелось бы сделать возможность удалить допустим 10, т.е. должно остаться 5 штук. Или есть проще вариант. Вариант с прописыванием файлов вручную не вариант, т.к. файлов в каждом компоненте много и они пересекаются в одних и тех же папках. »
Честно говоря вообще не понятно, что вы хотите сделать? Два uninstall ? или один но который не все подчищает за собой?

MKN
11-02-2013, 17:23
Вариант с прописыванием файлов вручную не вариант, »
Отчего же ? Ты ведь уже потрудился , прописывая установку 20 компонентов.
Используй !insertmacro MUI_UNPAGE_COMPONENTS и пропиши всё что пожелаешь для выбора при удалении ,
на основании предварительной проверки уже установленных компонентов... (А это всего - по 3-4 строки кода для проверки наличия каждого компонента - есть ли такой то файл или ключ и если нет, то сделать недоступным чекбокс отсутствующего компонента... )
Вредный совет : А, если лень, то можно и без проверки, укажи все 20 - обычно ошибки при этом не бывает, хотя так будет бестолково и не правильно... :)
По моему , так гораздо проще и быстрее, чем возиться с логом...




© OSzone.net 2001-2012