Показать полную графическую версию : [архив].: NSIS - все вопросы :.
А можно как-то редактировать значение параметра в xml файле?
kotkovets
18-06-2012, 12:17
Кладу в папку тестер, запускаю, все срабатывает. Почему из функции не работает, не понятно. »
тысячу раз писал $INSTDIR в инсталляторе не одно и тоже, что в деинсталляторе,
а текущая директория, где находится деинсталлятор, точнее откуда он запущен,
процесс деинсталлятора "раздваивается", что бы удалить самого себя
---
Ivn78, Можно, если представить, что это обычный текстовый файл.
есть плагин, но довольный тяжелый в плане изучения/применения.
http://nsis.sourceforge.net/XML_plug-in
wolkow70
18-06-2012, 13:01
тысячу раз писал $INSTDIR в инсталляторе не одно и тоже, что в деинсталляторе,
а текущая директория, где находится деинсталлятор, точнее откуда он запущен, »
Это я знаю. В данном случае дело скорее всего не в этом. Так как, переименуемые файлы лежат в одной папке с деинсталлятором.
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
kotkovets, есть плагин, но довольный тяжелый в плане изучения/применения »
Это правда... может, найдется время написать для конкретного примера?
http://forum.oszone.net/post-1936249.html#post1936249
Это правда... может, найдется время написать для конкретного примера? »
Найдите время и поищите в этой теме совсем недавно стоял почти такой же вопрос, нужно было в 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 файле прочитать все строки и заменить значение пути к программе на свою строку, я тогда написал готовый пример, ищите в этой теме »
Я уже приводил тут код . Вопрос был точно такой же.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC