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

Ivn78
18-06-2012, 12:07
А можно как-то редактировать значение параметра в xml файле?

kotkovets
18-06-2012, 12:17
Кладу в папку тестер, запускаю, все срабатывает. Почему из функции не работает, не понятно. »
тысячу раз писал $INSTDIR в инсталляторе не одно и тоже, что в деинсталляторе,
а текущая директория, где находится деинсталлятор, точнее откуда он запущен,
процесс деинсталлятора "раздваивается", что бы удалить самого себя
---
Ivn78, Можно, если представить, что это обычный текстовый файл.
есть плагин, но довольный тяжелый в плане изучения/применения.
http://nsis.sourceforge.net/XML_plug-in

wolkow70
18-06-2012, 13:01
тысячу раз писал $INSTDIR в инсталляторе не одно и тоже, что в деинсталляторе,
а текущая директория, где находится деинсталлятор, точнее откуда он запущен, »
Это я знаю. В данном случае дело скорее всего не в этом. Так как, переименуемые файлы лежат в одной папке с деинсталлятором.

Ivn78
18-06-2012, 13:01
kotkovets, Можно, если представить, что это обычный текстовый файл »
а можно какой-нибудь пример...
нужно заменить значение Patch
<NotepadPlus>
<GUIConfigs>
<GUIConfig name="stylerTheme" path="C:\Program Files\Notepad++\stylers.xml" />
</GUIConfig>
</GUIConfigs>
</NotepadPlus>

wolkow70
18-06-2012, 13:19
а можно какой-нибудь пример... »
Я так делал для Opera

${StrRep}

Var _FindInFile ; В эту переменную поместим полный путь к файлу, в котором будем производить замену
Var _LineReplace ; В эту переменную поместим строку, которую будем искать и заменять
Var _LineToInsert ; В эту переменную поместим строку, НА которую мы будем заменять искомую строку
Var _CurLineNumber ; В этой переменной храним номер обрабатываемой строки
Var _CurLine ; В этой переменной храним строку, с которой в данный момент сверяем
Var _LineNumbers ; В этой переменной храним количество строк в искомом файле

Function ReplaceLinesInFile
;
${LineSum} "$_FindInFile" $_LineNumbers ; Подсчитываем количество строк
strcpy $_CurLineNumber 0
startLineRead:
intop $_CurLineNumber $_CurLineNumber + 1
IntCmp $_CurLineNumber $_LineNumbers 0 0 endFunc ; Если номер текущей строки больше количества строк в файле - поиск завершен
${LineRead} "$_FindInFile" "$_CurLineNumber" $_CurLine ; Читаем строку по номеру текущей строки
${WordFind} '$_CurLine' "$_LineReplace" "E+1{" $R0 ; Ищем в строке нужный текст
StrCmp $R0 "1" startLineRead 0 ; Если в строке присутствует искомый текст, выполняем код ниже
${LineFind} "$_FindInFile" "" "" "Insert_Line" ; Вызываем функцию Insert_Line, которая произведёт замену
goto startLineRead
endFunc:
;
FunctionEnd

Function Insert_Line
StrCmp $R8 "$_CurLineNumber" 0 push
${StrRep} $_CurLine "$_CurLine" "$_LineReplace" "$_LineToInsert"
FileWrite $R4 "$_CurLine"
StrCpy $0 SkipWrite
push:
Push $0
FunctionEnd


StrCpy $_FindInFile '$INSTDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$INSTDIR' ; На что будем заменять
Call ReplaceLinesInFile

kotkovets
18-06-2012, 14:14
а можно какой-нибудь пример... »
http://forum.oszone.net/post-933509.html

Ivn78
18-06-2012, 16:52
kotkovets, есть плагин, но довольный тяжелый в плане изучения/применения »
Это правда... может, найдется время написать для конкретного примера?
http://forum.oszone.net/post-1936249.html#post1936249

K.A.V.
18-06-2012, 18:52
Это правда... может, найдется время написать для конкретного примера? »
Найдите время и поищите в этой теме совсем недавно стоял почти такой же вопрос, нужно было в xml файле прочитать все строки и заменить значение пути к программе на свою строку, я тогда написал готовый пример, ищите в этой теме

wolkow70
18-06-2012, 19:30
kotkovets,
Весь день бился с проблемой - решилось постановкой ClearErrors перед началом кода.

ClearErrors
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}

Что за странные кавычки такие в коде ``. На нормальные кавычки они как переводятся?

wolkow70
18-06-2012, 19:48
Найдите время и поищите в этой теме совсем недавно стоял почти такой же вопрос, нужно было в xml файле прочитать все строки и заменить значение пути к программе на свою строку, я тогда написал готовый пример, ищите в этой теме »

Я уже приводил тут код . Вопрос был точно такой же.

Ivn78
18-06-2012, 20:10
wolkow70, Там проблема с количеством строк, оно может быть разным. Но попробую прикрутить.

А как можно переименовать уже установленный (не при распаковки) файл?

kotkovets
19-06-2012, 00:08
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<NotepadPlus>
<GUIConfigs>
<GUIConfig name="stylerTheme" path="C:\Program Files\Notepad++\stylers.xml" />
</GUIConfigs>
</NotepadPlus>


Name "XMLTest"
OutFile "XMLTest.exe"
ShowInstDetails show

!include "XML.nsh"
!include "Logiclib.nsh"
Section
${xml::LoadFile} "$EXEDIR\test.xml" $0
${If} $0 == 0
${xml::GotoPath} "/NotepadPlus/GUIConfigs/GUIConfig" $0 ;переходим к указаноому узлу
${xml::GetAttribute} "name" $0 $1 ;узнаем значение атрибута <name> узла </NotepadPlus/GUIConfigs/GUIConfig>
DetailPrint "name = $0"
${xml::GetAttribute} "path" $0 $1
DetailPrint "path = $0"
${xml::Unload}
${EndIf}
SectionEnd



Перезаписываем значение аттрибута path узла /NotepadPlus/GUIConfigs/GUIConfig
${xml::LoadFile} "$EXEDIR\test.xml" $0
${If} $0 == 0
${xml::GotoPath} "/NotepadPlus/GUIConfigs/GUIConfig" $0 ;переходим к указаноому узлу
${xml::SetAttribute} "path" "test_test_test" $0 ;презапись аттрибутов узла
${xml::SaveFile} "$EXEDIR\test.xml" $0
${xml::Unload}
${EndIf}


Допустим в xml файле два узла - GUIConfigs

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<NotepadPlus>
<GUIConfigs>
<GUIConfig name="stylerTheme" path="C:\Program Files\Notepad++\stylers.xml" />
</GUIConfigs>
<GUIConfigs>
<GUIConfig name="stylerTheme" path="C:\Program Files\Notepad++" />
</GUIConfigs>
</NotepadPlus>

то путь к второму узлу GUIConfigs - /NotepadPlus/GUIConfigs[2]/GUIConfig
На практике очень много одноименных узлов, можно перечислить все пути к узлам, к примеру - GUIConfigs
${xml::LoadFile} "$EXEDIR\test.xml" $0
loop:
${xml::FindNextElement} "GUIConfigs" $0 $1
StrCmp $1 -1 close
${xml::ElementPath} $0
DetailPrint "ElementPath: $0"
Goto loop
close:
${xml::FindCloseElement}
${xml::Unload}

wolkow70
19-06-2012, 10:11
А как можно переименовать уже установленный (не при распаковки) файл? »


Rename "$INSTDIR\Ext.dll" "INSTDIR\Ext.dll.bak"

Vincent7
19-06-2012, 18:03
kotkovets, как сделать неактивным поле выбора папки на кастомной странице?

kotkovets
19-06-2012, 18:49
Vincent7, как прочитать пару предыдущих страничек темы? например 278...

Vincent7
19-06-2012, 19:53
kotkovets, kotkovets, ага, сделал, но фон поля остался белым, а нужно чтобы был серый как тут http://upwap.ru/2553232
Как сменить цвет?
И как вы звать 'свободно/требуется места на диске' опять же как на скрине?

kotkovets
19-06-2012, 20:07
kotkovets, ага, сделал, но фон поля остался белым »
а покажите КАК сделали :lol:
а то я не знаю.... у меня всегда серый :) или белый :)

Vincent7
19-06-2012, 20:24
kotkovets, вот так: nsDialogs::SelectFolderDialog /NOUNLOAD $9 "$R0"
Pop $R0
GetDlgItem $R0 $HWNDPARENT 0
EnableWindow $R0 0

kotkovets
19-06-2012, 20:38
Vincent7, а причем тут выбор папки??????????????????????????????????
Если SelectFolderDialog возвращает выбранную папку (путь к папке) иначе error
nsDialogs::SelectFolderDialog /NOUNLOAD $9 "$R0"
Pop $R0
MessageBox MB_OK $R0
------
nsDialogs::SelectFolderDialog "титульная надпись" "$EXEDIR" ;-->(папка при открытии диалога)
Pop $R0
MessageBox MB_OK $R0
-----
может вам почитать справочку на русском -» nsDialogs: Создаем собственные страницы инсталлятора
И не делать и писать глупые сообщения, я не попугай, каждый раз повторять одно и тоже

Vincent7
19-06-2012, 20:43
kotkovets, В русском справочнике не так много информации по плагину nsDialogs как хотелось бы, я английский читал. Да вы правы, глупость я написал, но с полем я разобрался. Осталось последнее, реализовать надписи 'свободно/требуется места на диске' как на скриншоте. Как их вызвать?




© OSzone.net 2001-2012