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

XCV
10-01-2012, 22:47
XCV если ваша библиотека, то определите свой ключ в реестре, читаемый библиотекой,так проще наверно будет. »
библиотеки свои, но нужна для работы нескольких приложений код которых менять не могу, как вариант закидать ее в папку к приложению, точнее в 3 папки (зачем плодить файлы), пока нашел другой выход, тупо закидаю их в папку sys32 которая по своей природе прописана в переменной path, попробую плагин покрутить, жаль времени не хватает (особенно когда найдено временное, может не совсем красивое, но вполне рабочее решение)

kotkovets
10-01-2012, 23:01
понятно, можно и без плагина обойтись, в шапке ссылка на справочник, там же найдете(в справке) библотеку для работы с реестром, но тоже время потратить нужно :)

XCV
11-01-2012, 10:17
решил разобраться с плагином используя замечательную справку из здешней шапки, и в итоге понял что мне не нужен ни плагин ни библиотека, а достаточно считать и записать ключик следующим образом:
ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;$INSTDIR"
спасибо всем за помощь, вопрос вроде полностью решен
извиняюсь что беспокоил всех по вопросу ответ на который был в справке

kotkovets
11-01-2012, 12:34
вот точно, совсем забыл,про WriteRegExpandStr...

Lisabon
11-01-2012, 15:47
kotkovets, может вспомнишь как писать REG_MULTI_SZ штатными средствами?

При помощи плагина Registry, пишется без проблем, например:

${registry::Write} "HKCU\Software\GNU\ffdshow\default" "avisynthScriptMULTI_SZ" "SetMTMode(3,2)$\nffdShow_Source()$\nSetMTMode(2,2)$\nDither_convert_8_to_16 ()$\nSmoothGrad(thr=0.9, radius=8)$\nDitherPost ()" "REG_MULTI_SZ" $FFDRaw
${registry::Unload}

kotkovets
11-01-2012, 19:35
Lisabon,смотри в справочник из шапки,там есть(метод WinApi) в оригинальной справке тоже есть- не иоспользуй,глюки!
Все значения, читаюся в цикле построчно.

Lisabon
11-01-2012, 20:17
не иоспользуй,глюки! »
О каких глюках идёт речь?

kotkovets
11-01-2012, 21:01
при чтении многострочных значений.
Строка вычисляется из 16-ричного адреса в ОЗУ.
Следущия строка (адрес строки) высчитывается из длины предыдущей строки + 1 символ. Стандартный плагин system конвертирует адрес в строку-плохо у плагина system получается,приводит к краху инсталятор.по этому я в своей либе применил IntFmt - работает безупречно.

Lisabon
11-01-2012, 21:46
kotkovets, теперь мне не понятно зачем в справочнике есть описание использования плагина Registry, в котором наблюдаются проблемы? Тогда может есть смысл в справочнике расписать альтернативу (метод WinApi) так сказать по-полному, все функции которые используются в плагине Registry.

kotkovets
11-01-2012, 22:27
Lisabon, с плагином registry всё в порядке :)
Я о говорил о некоторых ключевых моментах при использовании стандартных средств, в моей либе(RegistryFunc.nsh) полностью исключены эти глюки, по сути эта либа аналог плагина Registry.
Просто стремлюсь насколько возможно использовать стандартные средства NSIS

romgun
13-01-2012, 12:00
Опять по той же задаче пишу... Пытался разобраться, но из-за плохих знаний ничего не получается.
Смотрел пример, но как реализовать до конца не понял

http://forum.oszone.net/post-1683186-1213.html



Вот такое пытался писать..


Section
SetOutPath "$INSTDIR"
;нужен поиск по файлу 1.cfg на предмет наличия записи "aaaaaaaaaaaaaa.*=$INSTDIR\xxx\yyy". Если запись есть, ничего делать не нужно.
StrCpy $0 0
loop:
ReadINIStr $1 "$INSTDIR\1.cfg" "main" "aaaaaaaaaaaaaa"
StrCmp $1 "" Done
StrCmp $1 "xxx\yyy" 0 +3
StrCpy $0 1
Goto Done
IntOp $0 $0 + 1
Goto Loop
Done:
StrCmp $0 1 Next
; если записи нет, то нужно ее вставить "aaaaaaaaaaaaaa.*=$INSTDIR\xxx\yyy", где * - порядковый номер.
GetFullPathName $6 ..
${FileReadFromEnd} "$INSTDIR\1.cfg" "Find" ;читает строку за строкой? и записывает в $9?
WriteINIStr $INSTDIR\1.cfg main "aaaaaaaaaaaaaa.$3" "$6\xxx\yyy"
Next:
SectionEnd

Function Find
StrCpy $2 $9 14 ;Эту строку нужно обрезать до 14 первых символов (SimObjectPaths)
${if} $2 == "aaaaaaaaaaaaaa"
Intop $3 $3 + 1
${endif}
FunctionEnd

kotkovets
13-01-2012, 20:15
romgun, я же говорил в цикле читаем файл,в функции макроса значения совпадений уничтожается, поэтому для подсчёта объявляем свою переменную:
Var int
Пример файла:

[setup]
Name=app.exe
[dir]
Dirpatch_1=C:\
Dirpatch_2=D:\
Dirpatch_3=E:\

Пример:

Section
StrCpy $int 0

${FileReadFromEnd} "$InstDir\file.cfg" "Read"
${if} ${Errors}
MessageBox mb_ok "файл не найден"
${Else}
${For} $0 1 $int
ReadIniStr $1 "$InstDir\file.cfg" "dir" "Dirpatch_$0"
MessageBox mb_ok "$1"
${Next}
${EndIf}
SectionEnd

Function Read
StrCpy $R0 $9 9
${If} $R0 == "Dirpatch_"
InTop $int $int + 1

MessageBox mb_ok "$R0 - $int"
${EndIf}
Push $0
FunctionEnd

yyv
17-01-2012, 15:48
делаю свою страничку UNPAGE_CONFIRM для деинсталятора
подскажите как получить папку из какой был запущен деинсталятор?


$EXEDIR и $EXEPATH не подходят

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

C:\Program Files\uninstal\
C:\Documents and Settings\Admin\Рабочий стол\

используя же $EXEDIR я всегда получаю :
C:\WINDOWS\Temp\~nsu.tmp

up $OUTDIR - решает мою проблему

yyv
17-01-2012, 17:12
возвращаясь к старому вопросу

можно ли изменить внешний вид PAGE_INSTFILES
точнее UNPAGE_INSTFILES. но я думаю нет особых различий.
пробовал вызывать функции SHOW PRE
что-то типа

nsDialogs::Create 1018
Pop $5
${NSD_CreateLabel} 120u 10u 195u 40u "dialog create function"
Pop $R4
SetCtlColors $R4 "" "FFFFE1" nsDialogs::Show


но это не дает желаемого эффекта
Я получаю пустую страничку с одним лейблом без остальных контролов.

как можно (если можно) добавить собственные контролы?

И при этом что бы остались старые контролы и выполнялся код в секциях. (те что бы прогрес бар также адекватно на это реагировал)

kotkovets
17-01-2012, 17:20
текущая папка деинсталлятора - $INSTDIR
Деинсталлятор имеет два процесса - $EXEDIR, для того, чтобы удалить деинсталлятор.

Paval
17-01-2012, 18:14
Есть текстовый файл (list.txt). В нем находиться список файлов(а точнее пути к ним), которые требуется удалить. Задача стоит в том, что бы написать код деинсталятора, короый удаляет эти файлы.

Я пробовал так:


${LineSum} "$INSTDIR\list.txt" $NumOfFiles ;узнаем кол-во файлов, и значение заносим в $NumOfFiles

${For} $CurrentFileNumber 1 $NumOfFiles
${LineRead} "$INSTDIR\list.txt" $CurrentFileNumber $CurrentFileName ; в цикле for читаем построчно файл "list.txt" и значение (путь к файлу) заносим в $CurrentFileName
Delete "$CurrentFileName" ;удаляем файл по его пути.
${Next}


Ничего не получается. Удаляется лишь тот фал, что был последним в списке.

romgun
18-01-2012, 14:14
Надеюсь на помощь...
Структура нужна примерно такая: проверка1---проверка2---если нет данных, то запись---копирование новых файлов
Пытался делать кусками, но теперь проблема объединить.
С логикой беда - если значение не найдено, из цикла выползти не могу (разве что через ${LoopUntil} - см. в первом куске)

1 этап Проверка была ли уже установка. Желательно двумя способами - по cfg и по xml , которые могут быть либо в папке юзера, либо в папке All users
Проблема с циклом и переходом к анализу xml?



; поиск в cfg
Section
;если установлено для текущего пользователя
ClearErrors
IfFileExists "$APPDATA\Microsoft\FSX\fsx.cfg" 0 NotFiles
StrCpy $0 0
${Do}
ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
${If} $1 == "SimObjects\UT2 Aircraft"
MessageBox mb_ok "найден в юзерпапке"
${ExitDo}
${EndIf}
InTop $0 $0 + 1
${LoopUntil} $0 == '50' ;??????
Goto end
;если установлено для всех
NotFiles:
ClearErrors
SetShellVarContext all
StrCpy $0 0
${Do}
ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
${If} $1 == "SimObjects\UT2 Aircraft"
MessageBox mb_ok "найден в allusers"
${ExitDo}
${EndIf}
InTop $0 $0 + 1
${LoopUntil} $0 == '50' ;??????
end:
SectionEnd

; поиск в xml
Section
;если установлено для текущего пользователя
ClearErrors
StrCpy $0 0
IfFileExists "$APPDATA\Microsoft\FSX\exe.xml" 0 NotFiles
${xml::LoadFile} "$APPDATA\Microsoft\FSX\exe.xml" $0
loop1:
${xml::FindNextElement} "Name" $0 $1
${xml::GetText} $1 $2
${If} $1 == "UT2"
MessageBox MB_OK "$1 найден"
Goto end
${EndIf}
Goto loop1
${xml::FindCloseElement}
${xml::Unload}
NotFiles:
ClearErrors
;если установлено для всех
SetShellVarContext all
StrCpy $0 0
${xml::LoadFile} "$APPDATA\Microsoft\FSX\exe.xml" $0
loop:
${xml::FindNextElement} "Name" $0 $1
${xml::GetText} $1 $2
${If} $1 == "UT2"
MessageBox MB_OK "$1 найден"
Goto end
${EndIf}
Goto loop
${xml::FindCloseElement}
${xml::Unload}
end:
SectionEnd



2. Если в cfg не найдено, запись туда.
Слишком, по-моему, путано написано

Function Read
StrCpy $R0 $9 15
${If} $R0 == "SimObjectPaths."
InTop $int $int + 1
${EndIf}
Push $0
FunctionEnd

Section
;если установлено для текущего пользователя
IfFileExists "$APPDATA\Microsoft\FSX\fsx.cfg" 0 NotFiles
StrCpy $int 0
${FileReadFromEnd} "$APPDATA\Microsoft\FSX\fsx.cfg" "Read"
${if} ${Errors}
MessageBox mb_ok "CFG файл не найден"
${Else}
${For} $0 1 $int
ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
${Next}
${EndIf}
InTop $0 $0 - 1
WriteINIStr "$APPDATA\Microsoft\FSX\fsx.cfg" main "SimObjectPaths.$0" "SimObjects\UT2 Aircraft"
Goto Done
NotFiles:
; если установлено в папку для всех пользователей
SetShellVarContext all
IfFileExists "$APPDATA\Microsoft\FSX\fsx.cfg" 0 NotFiles2
StrCpy $int 0
${FileReadFromEnd} "$APPDATA\Microsoft\FSX\fsx.cfg" "Read"
${if} ${Errors}
MessageBox mb_ok "CFG файл не найден"
${Else}
${For} $0 1 $int
ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
${Next}
${EndIf}
InTop $0 $0 - 1
WriteINIStr "$APPDATA\Microsoft\FSX\fsx.cfg" main "SimObjectPaths.$0" "SimObjects\UT2 Aircraft"
Goto Done
NotFiles2:
MessageBox MB_OK "CFG файл не найден"
Done:
SectionEnd


3. если в xml не найдено, запись туда



Section
SetOutPath "$INSTDIR"
GetFullPathName $ID ..
${xml::LoadFile} "$APPDATA\Microsoft\FSX\exe.xml" $0
${xml::GotoPath} "/SimBase.Document" $0
${xml::CreateNode} <Launch.Addon></Launch.Addon> $1
${xml::InsertEndChild} "$1" $0
${xml::CreateNode} <Disabled>False</Disabled> $1
${xml::InsertEndChild} "$1" $0
${xml::CreateNode} <ManualLoad>False</ManualLoad> $2
${xml::InsertAfterNode} "$2" $1
${xml::CreateNode} <Name>UT2</Name> $3
${xml::InsertAfterNode} "$3" $2
${xml::CreateNode} '<Path>$ID\Flight One Software\Ultimate Traffic 2\UT2Services.exe</Path>' $4
${xml::InsertAfterNode} "$4" $3
${xml::CreateNode} <NewConsole>True</NewConsole> $5
${xml::InsertAfterNode} "$5" $4
${xml::SaveFile} "$APPDATA\Microsoft\FSX\test_sааaved.xml" $0
${xml::Unload} ; unload plugin
SectionEnd


4. Переименование и копирование папок. Здесь в принципе все ясно

SamLab
18-01-2012, 14:49
Вопросик по переменным системной папки винды

$SYSDIR в системе x86 и x64 ведет в System32

поэтому для помещения файлов в x64 системе в папку SysWOW64 приходится указывать $WINDIR\SysWOW64

может есть способ для оригинального установщика, дабы при определении системы как x86 файлы в System32 кидались, а в x64 в SysWOW64?


пока вот так делаю:
${If} ${SectionIsSelected} ${secX86install} ;
SetOutPath "$WINDIR\SysWOW64"
File "C:\x86.url"
${Else}
${EndIf}
${If} $R1 == "64" ;
SetOutPath "$WINDIR\System32\"
File "C:\x64.url"
${Else}
${EndIf}

но так в системе x86 файлы будут в SysWOW64 вместо System32 кидаться...

Krinkels
18-01-2012, 15:04
SamLab
Подобный вопрос уже проскальзывал, нужно просто проверять версию системы( х86 или х64 ) и в зависимости от результата выбирать ту или иную папку.

Paval
18-01-2012, 15:17
Есть каталог. В нем подкаталоги. Некоторые из них пустые. Как их удалить (только пустые)?




© OSzone.net 2001-2012