Показать полную графическую версию : [архив].: NSIS - все вопросы :.
wolkow70
16-06-2012, 17:06
Если так сделать?
${If} ${RunningX64}
${If} $GMODE = 0
${AndIf} ${Silent}
${AndIf} ${FileExists} "$INIFILE"
ClearErrors
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "INSTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES64" "+" $R1
${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
StrCpy $INSTDIR $R0
${EndIf}
${Else}
${If} $GMODE = 0
${AndIf} ${Silent}
${AndIf} ${FileExists} "$INIFILE"
ClearErrors
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "INSTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
StrCpy $INSTDIR $R0
${EndIf}
${EndIf}
Да, так работает.
wolkow70
17-06-2012, 10:58
А значит 32разрядной системе $PROGRAMFILES64 — папка Program files. »
Прктически оно так и получается. Смущает то, что это не документировано в официальной справке:
$PROGRAMFILES, $PROGRAMFILES32, $PROGRAMFILES64
The program files directory (usually C:\Program Files but detected at runtime). On Windows x64, $PROGRAMFILES and $PROGRAMFILES32 point to C:\Program Files (x86) while $PROGRAMFILES64 points to C:\Program Files. Use $PROGRAMFILES64 when installing x64 applications.
Поэтому расписываю отдельно.
wolkow70
17-06-2012, 11:29
Вот еще интересно:
Насколько оправдано использование хедера MoveFileFolder?
http://nsis.sourceforge.net/MoveFileFolder
Имеет ли он какие либо преимущества перед коммандой
Rename $INSTDIR\file.ext $INSTDIR\file.dat ?
kotkovets
17-06-2012, 12:00
Имеет ли он какие либо преимущества перед коммандой
Rename $INSTDIR\file.ext $INSTDIR\file.dat ? »
преимущество только в том, что можно указывать какие файлы(с каким расширением) нужно переместить из папки, включая
вложенные каталоги с файлами.
wolkow70
17-06-2012, 12:15
kotkovets,
Существует ли какой-либо сопособ (плагин например) разлочить занятый эксплорером файл. Например по пиду процесса (подобно анлокеру).
Выясняется, что залоченный файл RarExt.dll (или аналогичные) можно в процессе деинсталляции переименовать напрмер в RarExt.dll.0.tmp переместив в папку TEMP, и удалить программную папку без перезагрузки. Это дает возможность сразу переустановить программу без перезагрузки. Но хочется уже в папке TEMP как-то добить этой файл, так как его удаление требует все-равно перезагрузки или перезапуска экспорера.
Еще задачка перед перемещением файла проверить временную папку на наличие файла с таким же именем, и если есть то переименовать RarExt.dll.0.tmp в RarExt.dll.(номер).tmp и задать комманду на удаление.
kotkovets
17-06-2012, 12:41
загруженная в оболочку проводника делка работает по пидом :) проводника.
Остальное, что вы пишите и видете - просто скрытие от глаз, что типа библиотека удаляется...
(хотя можно удалить физически файл, но это зависит от разработчика библиотеки, какие функции он всунул при разрегистации библиотеки) в оперативной памяти загруженная библиотека остается, до перезагрузки компа/оболочки.
вообще это оффтоп, поэтому обсуждение не хочу продолжать - написал так, как я считаю.
kotkovets
17-06-2012, 13:53
Подскажите плиз, как удалить директорию, только если она пуста? »
#1985 (http://forum.oszone.net/post-1810498-1985.html)
kotkovets,
ага, а макрос в какую часть кода лучше вставить? в начало?
wolkow70
17-06-2012, 15:01
kotkovets,
Подскажите плиз где ошибка в функции - счетчик не меняет значения
Function un.RarExt
Push $2
Push $1
Push $0
;
${If} ${FileExists} "$INSTDIR\RarExt.dll.0.tmp"
StrCpy $2 0
FindFirst $0 `$1` "$INSTDIR\RarExt*"
${Do}
IntOp $2 $2 + 1
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0
${If} $2 != 0
!insertmacro MoveFile "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.$2.tmp"
${EndIf}
${Else}
!insertmacro MoveFile "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.0.tmp"
${EndIf}
;
Pop $0
Pop $1
Pop $2
FunctionEnd
Call un.RarExt
kotkovets
17-06-2012, 15:18
ага, а макрос в какую часть кода лучше вставить? в начало? »
без разницы, главное запуск макроса происходил после объявления макроса.
где ошибка в функции »
смешно становится, если выделить глобальное условие
${If} ${FileExists} "$INSTDIR\RarExt.dll.0.tmp"
;!insertmacro MoveFile "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.$2.tmp"
;тут выполняются условия, если есть файл - $INSTDIR\RarExt.dll.0.tmp
${Else}
;!insertmacro MoveFile "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.0.tmp"
;тут выполняются условия, если нету файла - $INSTDIR\RarExt.dll.0.tmp
${EndIf}
wolkow70
17-06-2012, 16:37
если выделить глобальное условие »
Тут должно выполняться условие такое:
1. Если нет файла $INSTDIR\RarExt.dll.0.tmp, то файл $INSTDIR\RarExt.dll переименовывается в $INSTDIR\RarExt.dll.0.tmp
Это в приведенной функции работает.
2. Если есть $INSTDIR\RarExt.dll.0.tmp, то он переименовывается в "$INSTDIR\RarExt.dll.$2.tmp", а файл "$INSTDIR\RarExt.dll" переименовывается в $INSTDIR\RarExt.dll.0.tmp
Это не работает. Нумерация файла в $2 не меняется.
kotkovets
17-06-2012, 17:08
Это не работает. Нумерация файла в $2 не меняется. »
все работает.
${If} ${FileExists} "$INSTDIR\RarExt.dll.0.tmp"
StrCpy $2 0
FindFirst $0 `$1` "$INSTDIR\RarExt*"
${DoUntil} ${Errors}
IntOp $2 $2 + 1
MessageBox MB_OK "$1" IDOK
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0
MessageBox MB_OK "$2" IDOK
${EndIf}
Вот тока не пойму, зачем эта возня?
1. Если есть RarExt.dll.0.tmp, то $2 уже будет равен одному.
2. Все последующие файлы с именем RarExt* будут увеличивать на единицу переменную $2
3. Если таких файлов будет больше двух, будет переименовываться последний найденный.
---
или так все таки лучше :) вскидка на дальнейшее размышление...
${If} ${FileExists} "$INSTDIR\RarExt.dll.0.tmp"
FindFirst $0 `$1` "$INSTDIR\RarExt*"
${DoUntil} ${Errors}
Rename "$INSTDIR\$1" "$INSTDIR\RarExt.dll"
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0
${EndIf}
wolkow70
17-06-2012, 17:51
Вот тока не пойму, зачем эта возня? »
Так ведет себя программа при оригинальной деинсталляции. Видимо сделано для возможности оперативной переустановки или обновления программы. Я несколько раз устанавливал и удалял WinRar и каждый раз создавались новые файлы RarExt.dll.0.tmp с большим порядковым номером вместо 0. И так до перезагрузки. После чего они все удалялись.
kotkovets
17-06-2012, 18:45
тренер
!include "MUI2.nsh"
OutFile "resrt.exe"
ShowInstDetails show
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
Section ""
StrCpy $2 -1
FindFirst $0 `$1` "$EXEDIR\test*"
${DoUntil} ${Errors}
StrCmp $1 "test.dll" +2
Intop $2 $2 + 1
DetailPrint "$2) $1"
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0
MessageBox MB_OK "integer: $2" IDOK
${If} $2 == -1
CopyFiles /silent "$EXEDIR\test.dll" "$EXEDIR\test_0.dll"
${Else}
Intop $2 $2 + 1
CopyFiles /silent "$EXEDIR\test.dll" "$EXEDIR\test_$2.dll"
${EndIf}
SectionEnd
Vincent7
17-06-2012, 19:46
kotkovets, вы ответите на мой вопрос?
kotkovets
17-06-2012, 20:11
вы ответите на мой вопрос? »
ответ есть в теме и в справочнике для создания своих страниц.
---
Сами то что сделали по вопросу - не вижу ничего...
wolkow70
17-06-2012, 20:44
Скрипт для тренировки, как создать файл с большим порядковым номером, так, что думайте, подсказка есть: »
Потестил тренировочный скрипт. Файл один раз скопировался test.txt - test_0.txt. Дальнейшие запуски тестера ни к чему не привели.
С WinRar вот как стоит задача:
При удалении программы RarExt.dll переименовывается в RarExt.dll.0.tmp. При этом RarExt.dll.0.tmp
и остается залоченной в оперативной памяти. Это позволяет продолжать работу с программой при обновлении или переустановке программы. Только после перезапуска оболочки полномочия переходят к новой делке.
При этом, если в папке с программой уже есть файл с наименованием RarExt.dll.0.tmp, то при следующей деинсталляции RarExt.dll переименовывается в RarExt.dll.1.tmp и т.д.
kotkovets
17-06-2012, 21:20
Потестил тренировочный скрипт. Файл один раз скопировался test.txt - test_0.txt. Дальнейшие запуски тестера ни к чему не привели. »
исправил, тренируйтесь :) http://forum.oszone.net/post-1935854-2795.html
wolkow70
18-06-2012, 12:03
исправил, тренируйтесь »
Мистика какая-то. Сделал из вашего кода тестер под свой лад:
StrCpy $2 -1
FindFirst $0 `$1` "$INSTDIR\RarExt*"
${DoUntil} ${Errors}
StrCmp $1 "RarExt.dll" +2
Intop $2 $2 + 1
DetailPrint "$2) $1"
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0
MessageBox MB_OK "integer: $2" IDOK
${If} $2 == -1
Rename "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.0.tmp"
${Else}
Intop $2 $2 + 1
Rename "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.$2.tmp"
${EndIf}
Компилирую, все работает как надо.
Помещаю код в функцию:
Function un.RarExt
Push $2
Push $1
Push $0
;
StrCpy $2 -1
FindFirst $0 `$1` "$INSTDIR\RarExt*"
${DoUntil} ${Errors}
StrCmp $1 "RarExt.dll" +2
Intop $2 $2 + 1
DetailPrint "$2) $1"
FindNext $0 `$1`
${LoopUntil} $1 == ``
FindClose $0
MessageBox MB_OK "integer: $2" IDOK
${If} $2 == -1
Rename "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.0.tmp"
${Else}
Intop $2 $2 + 1
Rename "$INSTDIR\RarExt.dll" "$INSTDIR\RarExt.dll.$2.tmp"
${EndIf}
;
Pop $0
Pop $1
Pop $2
FunctionEnd
Вызываю из анисталлера
Call un.RarExt
Не работает. Точнее переименовывает в первый раз. А потом показывает integer -1.
Кладу в папку тестер, запускаю, все срабатывает. Почему из функции не работает, не понятно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC