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
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
загруженная в оболочку проводника делка работает по пидом :) проводника.
Остальное, что вы пишите и видете - просто скрытие от глаз, что типа библиотека удаляется...
(хотя можно удалить физически файл, но это зависит от разработчика библиотеки, какие функции он всунул при разрегистации библиотеки) в оперативной памяти загруженная библиотека остается, до перезагрузки компа/оболочки.
вообще это оффтоп, поэтому обсуждение не хочу продолжать - написал так, как я считаю.

Ivn78
17-06-2012, 13:33
del

kotkovets
17-06-2012, 13:53
Подскажите плиз, как удалить директорию, только если она пуста? »
#1985 (http://forum.oszone.net/post-1810498-1985.html)

Ivn78
17-06-2012, 15:00
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