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

diakov
25-12-2011, 12:58
kotkovets, теперь такая проблемка, не знаю даже возможно ли её исправить...
есть такие записи


WriteRegStr HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP2: ShellExt"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "C:\PROGRA~1\AIMP2\System\AIMP_S~1.DLL"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
WriteRegStr HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"

они отвечают за такое

http://s013.radikal.ru/i324/1112/4b/6d9ff894c28f.jpg

Но это действует только в х86, а на х64 даже при установке с оригинального инсталлятора такого контекста нет...
Как это моно поправь, и возможно ли вообще?

И еще как проверить не установлена ли программа в системе при запуске инсталятора???

kotkovets
25-12-2011, 13:33
diakov,
Вам нужно регистрировать библиотеку aimp_shell.dll, а не ламерские и глупые сообщения разводить...
Regdll "путь к aimp_shell.dll"
и разрегистрация:
UnRegdll "путь к aimp_shell.dll"
Для контекстного меню AIMP3 есть файлики:
aimp_menu32.dll
aimp_menu64.dll
Эти файлики регистрируются, так:
regdll "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonRegister
разрегистрация:
regdll "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonUnregister
И еще как проверить не установлена ли программа в системе при запуске инсталятора??? »
Проверяйте путь, куда устанавливали программу - IfFileExists
--
Книжки читайте, там все расписано.

diakov
25-12-2011, 14:24
Если что извините за торможение я просто еще учусь....

kotkovets
25-12-2011, 14:28
diakov, Не нужно извиняться, просто почитайте, поэкспериментируйте, а затем пишите,
а то не гоже - тот час писать, не получается, толком не разобравшись.

diakov
25-12-2011, 14:33
да не тот час, если есть предположения то я экспериментирую, а если нет то спаршиваю...

з регистрацией и ассоциацией сидел часа 4 глаза с ночи красные как у быка! Но разобрался :ok:

wolkow70
25-12-2011, 15:48
diakov,


IfFileExists "$PROGRAMFILES\AIMP3\AIMP3.exe" 0 CheckProfiles
Goto CheckComplete
;
CheckProfiles:
IfFileExists "$APPDATA\AIMP3\AIMP3.INI" 0 CheckComplete
;
CheckComplete:
MessageBox MB_ICONINFORMATION|MB_OK "AIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. Данный инсталлятор не может быть использован поверх AIMP3"
Abort

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

diakov
25-12-2011, 16:29
wolkow70, а если пользователь установил прогу не в $PROGRAMFILES а AIMP3.INI нет тода как?

kotkovets
25-12-2011, 16:58
wolkow70,
Совершенно неверная логика, которая всегда приведет к сообщению, что AIMP3 установлен!
А Вот так правильна, логика ИЛИ
${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
${OrIf} ${FileExists} "$APPDATA\AIMP3\AIMP3.INI"
${OrIf} ${FileExists} "$INSTDIR\AIMP3\AIMP3.INI"
MessageBox MB_ICONINFORMATION|MB_OK "AIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. Данный инсталлятор не может быть использован поверх AIMP3"
Abort
${EndIf}
Путь можно из реестра получать, например, при регистрации библиотеки оболочки,
можно получить путь к dll, т.е папку установленной программы, затем проверяем наличие выше указанных файлов.

wolkow70
25-12-2011, 17:50
wolkow70, а если пользователь установил прогу не в $PROGRAMFILES а AIMP3.INI нет тода как? »
Это требование автора, а не мое. Видимо его беспокоит только стандартная установка.

wolkow70,
Совершенно неверная логика »

Это не я придумал, а выдернул из скрипта, который тут на форуме выложен.
Там так:
Function .onInit

--бла-бла--

;Выполняем требования автора проекта.
StrCpy $Violation 0
;
IfFileExists "$PROGRAMFILES\AIMP3\AIMP3.exe" 0 CheckProfiles
StrCpy $Violation 1
Goto CheckComplete
;
CheckProfiles:
IfFileExists "$APPDATA\AIMP3\AIMP3.INI" 0 CheckComplete
;
StrCpy $Violation 1
;
CheckComplete:
StrCmp $Violation 1 0 +4
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "AIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. Данный инсталлятор не может быть использован поверх AIMP3"
Abort
EndFunc:
FunctionEnd

diakov
25-12-2011, 17:58
kotkovets, подскажи, ато счас криша поедет :help:

такой код для IcoFX2 отлично работает и на ссклинер такой ставил тоже работает и с /S /inst и с /S /port


Function .onInit
InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"

ClearErrors
${GetOptions} "$CMDLINE" "/port" $R0
${If} ${Silent} ;если тихий режим
${IfNot} ${Errors}
SetOutPath "$EXEDIR\IcoFX2Portable"
File /r "D:\IcoFX\IcoFX 2.0\*.*"
CreateDirectory "$APPDATA\IcoFX2"
SetOutPath "$APPDATA\IcoFX2"
File /r "D:\IcoFX\IcoFX2\*.*"
;тут пишем все команды при распаковки портативной версии
;здесь будет код выполняться с ключом /port в тихом режиме
StrCpy $Radio1 1 ;распаковка портативной версии
StrCpy $Radio 0 ;запрет установки в обычном режиме
${Else}
${GetOptions} "$CMDLINE" "/inst" $R0
SetOutPath "$INSTDIR"
StrCpy $Radio1 0 ;запрет портативной версии
StrCpy $Radio 1 ;установка в обычном режиме
StrCpy $Check2 1
StrCpy $Check 1
StrCpy $Check1 1
MessageBox MB_OK "${PRODUCT_NAME} ${PRODUCT_VERSION} установлена в тихом режиме."
ClearErrors
${EndIf}
${EndIf}
FunctionEnd


и такой же только для аимпа не работает :durak:


Function .onInit
InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"

ClearErrors
${GetOptions} "$CMDLINE" "/port" $R0
${If} ${Silent} ;если тихий режим
${IfNot} ${Errors}
SetOutPath "$EXEDIR\AIMPPortable"
File /r "D:\Aimp\AIMP2\*.*"
;тут пишем все команды при распаковки портативной версии
;здесь будет код выполняться с ключом /port в тихом режиме
StrCpy $Radio1 1 ;распаковка портативной версии
StrCpy $Radio 0 ;запрет установки в обычном режиме
StrCpy $Check3 1
${Else}
${GetOptions} "$CMDLINE" "/inst" $R0
SetOutPath "$INSTDIR"
StrCpy $Radio1 0 ;запрет портативной версии
StrCpy $Radio 1 ;установка в обычном режиме
StrCpy $Check2 1
StrCpy $Check 1
StrCpy $Check1 1
StrCpy $Check3 1
MessageBox MB_OK "${PRODUCT_NAME} ${PRODUCT_VERSION} установлена в тихом режиме."
ClearErrors
${EndIf}
${EndIf}
FunctionEnd

Просто мелькает черное кошко командной строки и все..
Как так?????????????

wolkow70
25-12-2011, 17:58
Путь можно из реестра получать, например, при регистрации библиотеки оболочки,
можно получить путь к dll, т.е папку установленной программы, затем проверяем наличие выше указанных файлов. »
А зачем жизнь усложнять. Автор требует проверять стандартные пути.

diakov
25-12-2011, 18:21
Все разобрался...оказывается у меня имя екзешника AIMP-3.0.0.970 RC3.exe переименовал его на AIMP-3.0.0.970.exe

и все заработало)

kotkovets
25-12-2011, 18:23
diakov, Сколько можно а...вы прикалываетесь или мегамоск спать хочет?
ЕСЛИ, $Radio1 = 1 ---> распаковка портативной версии
Какого? в функции .onInit писать распаковку, если распаковываться будет из секции, дважды распаковка O_o
уберите
SetOutPath "$EXEDIR\AIMPPortable"
File /r "D:\Aimp\AIMP2\*.*"
Просто возьмите в портабле в вместо выше кода, пишите, принудительно установите значение $INSTDIR:
StrCpy "$INSTDIR" "$EXEDIR\AIMPPortable"
Читайте книжки, в оригинальной справке введите, поиск по индексу: GetOptions
${GetOptions} "$CMDLINE" "/inst" $R0 - уберите это зло :)
Зачем вам куча ключей, когда вам достаточно ключа (/port) портативной установки в тихом режиме
Нет ключа этого в тихом режиме - обычная установка в тихом режиме.
Че тебе старче надо то еще??? :biggrin:

wolkow70
25-12-2011, 18:30
diakov,
Вы не обращали внимание, что оригинальный инсталлятор ставит ассоциации в HKCU, и там же прописывает $ClassName?

diakov
25-12-2011, 18:35
Затупил согласен) ${GetOptions} "$CMDLINE" "/inst" $R0 » ну это же не ошибка? просто я хочу два ключа порт - портативка а инст - иснталяция)

Вы не обращали внимание, что оригинальный инсталлятор ставит ассоциации в HKCU, и там же прописывает $ClassName? »

Это Вы к чему?

kotkovets
25-12-2011, 18:51
ну это же не ошибка? просто я хочу два ключа порт - портативка а инст - иснталяция) »
Не ошибка, зачем усложнять код, который вы до конца не понимаете???
А что будет, если создать поддержку ключа /inst, запустив установщик с ключом /S ???
А будет, тоже самое, что с ключом /inst !, отсюда вывод -
не нужно усложнять сложное - себе же мозг выносить, причем понапрасну :yes:

wolkow70
25-12-2011, 19:15
Это Вы к чему? »

К тому, что это неправильно. Но, иногда нужно подстраиваться под поведение программы для дальнейшего с ней взаимодействия.


Себе я сборку собрал уже. Все работает. Проблему наблюдаю только с регистрацией библиотеки
RegDLL "$INSTDIR\Modules\aimp_menu32.dll"
Впрочем проблема наблюдается и при использовании коммандной строки и программы RegDlllview? Ну не хочет она ни регистрироваться ни де-регистрироваться, хотя через саму программу запросто.

diakov
25-12-2011, 19:23
wolkow70, не знаю как у Вас но меня после установки AIMP 3.00 Build 970 RC 3 вообще никаких ассоциаций с медиа файлами не было

только эти строки появились

WriteRegStr HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP2: ShellExt"
WriteRegStr HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "$INSTDIR\System\aimp_shell.dll"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"

а я уже настроил по своему....плюс подключил библиотеку иконок и привязал к аудио Black Style.dll

kotkovets
25-12-2011, 19:27
Себе я сборку собрал уже. Все работает. Проблему наблюдаю только с регистрацией библиотеки
RegDLL "$INSTDIR\Modules\aimp_menu32.dll" »
Дело в том, что Regdll вызывает в библиотеке сервера стандартную процедуру регистрации - DllRegisterServer
Однако, разработчик может сменить название процедуры регистрации, что позволяет и NSIS.
А команда UnRegDll вызывает только - DllUnregisterServer,
поэтому разрегистрацию производим тоже, через Regdll.
http://forum.oszone.net/post-1821953-2142.html
В х64 пока прокатил такой вот вариант:
Windows Registry Editor Version 5.00


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMP]
@="{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMP]
@="{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}]
@="AIMP ShellExt Unit"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32]
@="D:\\AIMP3\\Modules\\aimp_menu64.dll"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved]
"{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"="AIMP ShellExt Unit"

wolkow70
26-12-2011, 10:50
поэтому разрегистрацию производим тоже, через Regdll. »
Я решил перестраховаться и все еще перед вызовом регистрации продублировал в ручную. Сработает - перезапишет. Если сбой будет - не страшно.

Section "Расширенная интеграция в контекстое меню Проводника" ContextMenu
SectionIn 1 2
SetOutPath "$INSTDIR"
WriteRegStr HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMP" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMP" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "AIMP ShellExt Unit"
;
${If} ${RunningX64}
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP ShellExt Unit"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "$INSTDIR\Modules\aimp_menu64.dll"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
;
regdll "$INSTDIR\Modules\aimp_menu64.dll" ContextMenuAddonRegister
${Else}
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP ShellExt Unit"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "$INSTDIR\Modules\aimp_menu32.dll"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
;
regdll "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonRegister
${EndIf}
SectionEnd
В удалялке тоже продублировал в ручную.




© OSzone.net 2001-2012