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

kotkovets
12-04-2012, 11:33
wolkow70, складывать флаги нужно:
intop $R0 ${SF_RO} + ${SF_BOLD}
intop $R0 $R0 + ${SF_SELECTED}
SectionSetFlags ${Install} "$R0"
или так:
intop $R0 ${SF_RO} | ${SF_BOLD}
intop $R0 $R0 | ${SF_SELECTED}
SectionSetFlags ${Install} "$R0"
Без прав и доступа к файлу - ничего не сделать. Об этом и речь. »
http://forum.oszone.net/showpost.php?p=1128494

MKN
12-04-2012, 11:51
kotkovets,
Это я знаю. Но это командная громозда с cmd.exe и т.д. , которой хотелось бы избежать. Неужели нет иных способов ?

kotkovets
12-04-2012, 12:21
Это я знаю. Но это командная громозда с cmd.exe и т.д. , которой хотелось бы избежать. Неужели нет иных способов ? »
причем здесь cmd? когда takeown, или nsExec - все скрытно
а че такие вопросы задаешь, думай как - вот тебе подсказка,
где можно при следущей перезагрузке прописать, что угодно
http://forum.oszone.net/post-1795270-1898.html

MKN
12-04-2012, 12:46
kotkovets,
takeown.exe - в XP нет, уже не удобство..
в RunOnce я команду удаления тоже прописывал - никакого эффекта...

wolkow70
12-04-2012, 12:54
Над своей задачкой подумал и набросал так:

!include "FileFunc.nsh"
${GetRoot}

InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"

Section "${PRODUCT_NAME} (установка программы)" Install
;
StrCmp $INSTDIR "$PROGRAMFILES\${PRODUCT_NAME}" CheckDisc ParsingXML
CheckDisc:
${GetRoot} "$PROGRAMFILES\${PRODUCT_NAME}" $R0
StrCmp $R0 "C:" NoParsing ParsingXML
ParsingXML:
StrCpy $_FindInFile '$INSTDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$INSTDIR' ; На что будем заменять
Call ReplaceLinesInFile
NoParsing:
SectionEnd

kotkovets
12-04-2012, 13:25
wolkow70, а вы мастер! с завидной упертостью наступать на одни и те же грабли с метками :)
StrCmp $INSTDIR "$PROGRAMFILES\${PRODUCT_NAME}" 0 ParsingXML
${GetRoot} "$PROGRAMFILES\${PRODUCT_NAME}" $R0
StrCmp $R0 "C:" NoParsing 0
ParsingXML:
StrCpy $_FindInFile '$INSTDIR\opera_install_log.xml'
StrCpy $_LineReplace 'C:\Program Files\Opera'
StrCpy $_LineToInsert '$INSTDIR'
Call ReplaceLinesInFile
NoParsing:
а вот почему диск C: ?, а вот у меня системный диск D: - где папка с программами
StrCmp $R0 "C:" NoParsing 0
и че тут вытекает, если я на диск С: ставлю - то не парсится, а у меня системный диск D...
какой то киноляп....

wolkow70
12-04-2012, 13:48
наступать на одни и те же грабли с метками »
Почему грабли? Просто вместо 0 применяю безусловную метку, все же работает :).
Ну сомневаюсь я , что можно в StrCmp ставить рядом условные и безусловные метки. По моему или то или другое (поскольку в справке нет иных примеров).
Вы мне подскажите такую весчь:
ReadRegStr $R6 HKLM "SOFTWARE\Classes\Applications\Opera.exe\shell\open\command" ""

получаем "C:\Program Files\Opera\Opera.exe" "%1"

далее

${GetParent} "$R6" "$R7"

получаем "C:\Program Files\Opera

RMDir /r "$R7"

Папка не удаляется. Потому, что кавычки не закрыты. Надо из этого ключа взять папку установки для удаления при переустановке.

kotkovets
12-04-2012, 14:11
Ну сомневаюсь я , что можно в StrCmp ставить рядом условные и безусловные метки. »
:) вы читайте до раз 50 про условные метки и безусловные, там четко прописано
Определяя метки для различных команд, помните, что 0 или пустое значение, означает переход к следующей команде.
получаем "C:\Program Files\Opera »
то как Вы удалите, если у вас лишний символ? ну так избавьтесь от лишнего первого символа командой StrCpy - в справке

wolkow70
12-04-2012, 14:51
избавьтесь от лишнего первого символа командой StrCpy - в справке »
Так сделал:

Push $R6
Push $R7
Push $R8
ReadRegStr $R6 HKLM "SOFTWARE\Classes\Applications\Opera.exe\shell\open\command" ""
${GetParent} "$R6" "$R7"
StrCpy $R8 "$R7" "" 1
RMDir /r "$R8"
Pop $R8
Pop $R7
Pop $R6

если я на диск С: ставлю - то не парсится »
А зачем ему парсится если C:\Program Files\Opera есть в эталонном файле, и там около 2000 строк. Долго парсится. Поэтому парсится только во всех остальных случаях.
Мне не совсем ясно из каких соображений можно имея системный диск D; ставить программу в C:\Program Files\

kotkovets
12-04-2012, 15:15
wolkow70, проще и эффективнее и главное удаляет любой указанный символ,
в начале и в конце строки - независимо от количества символов
ReadRegStr `$R6` HKLM "SOFTWARE\Classes\Applications\Opera.exe\shell\open\command" ""
${GetParent} `$R6` `$R6`
System::Call 'shlwapi::StrTrim(tR6R6, t""")'
MessageBox MB_OK "$R6" IDOK
Мне не совсем ясно из каких соображений можно имея системный диск D; ставить программу в C:\Program Files\ »
вот и вы подумайте, то парсить нужно, если ставиться не в системные папки ($PROGRAMFILES)
а у вас тупо диск С поставлен. то будет при другом раскладе ставлю прогу на диск С в любую папку - не парсится.
ставлю в другой системный раздел отличным от диска С, то парсится.... смысл ????

wolkow70
12-04-2012, 16:21
то парсить нужно, если ставиться не в системные папки ($PROGRAMFILES) »
Или в системные ($PROGRAMFILES), но расположенные на диске отличном от С: , поскольку в эталонном фале указан абсолютный путь C:\Program Files\Opera для файлов и ключей реестра и он прописывается оригинальным инсталлятором. Хотя можно сделать оригинальную установку с другим путем и использовать другой файл как эталонный.
ставлю прогу на диск С в любую папку - не парсится »
Как раз парсится. На парсится только при полном совпадении $INSTDIR c C:\Program Files\Opera.
Поэтому проверяется как переменная пути установки , так и буква диска.
смысл ???? »
Смысл в том, что без этого файла Opera не идентифицирует себя как браузер по умолчанию.

MKN
13-04-2012, 11:48
${StrSort}

${StrSort} "ResultVar" "String" "LeftMarkerSubString" "SubString" "RightMarkerSubString" "IncludeLeftMarkerSubString" "IncludeSubString" \
"IncludeRightMarkerSubString"

В зависимости от выбора установки "SubString" и маркеров "LeftMarkerSubString" и "RightMarkerSubString" - будет "тасоваться" содержимое строки

Характерные примеры использования :


!include "StrFunc.nsh"
${StrSort}

Name "StrSort"
OutFile "StrSort.exe"

;${StrSort} "ResultVar" "String" "LeftMarkerSubString" "SubString" "RightMarkerSubString" "IncludeLeftMarkerSubString" "IncludeSubString" "IncludeRightMarkerSubString"

Section

MessageBox MB_OK " Преобразуем строку:\
$\r$\nПрилетит вдруг волшебник в голубом вертолёте\
$\r$\n используя различные ключи-параметры"

StrCpy $0 "Прилетит вдруг волшебник в голубом вертолёте"

MessageBox MB_OK 'Исключим из строки слово - "волшебник". \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "" "волшебник" "" "0" "0" "0"'

${StrSort} $1 "$0" "" "волшебник" "" "0" "0" "0"
MessageBox MB_OK "Получаем в переменной : $1"

MessageBox MB_OK 'Оставляем в строки всё, что находится слева-направо ПЕРЕД словом "волшебник". \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "" "" "волшебник" "0" "0" "0"'

${StrSort} $2 "$0" "" "" "волшебник" "0" "0" "0"
MessageBox MB_OK "Получаем в переменной : $2"

MessageBox MB_OK 'Оставляем в строки всё, что находится ЗА словом "волшебник" . \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "вдруг" "волшебник" "" "0" "0" "0"'

${StrSort} $3 "$0" "вдруг" "волшебник" "" "0" "0" "0"
MessageBox MB_OK "Получаем в переменной : $3"

MessageBox MB_OK 'Оставляем в строки всё, что находится ЗА словом "волшебник" + слово "волшебник" . \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "вдруг" "волшебник" "" "1" "1" "0"'

${StrSort} $3 "$0" "вдруг" "волшебник" "" "0" "1" "0"
MessageBox MB_OK "Получаем в переменной : $3"

MessageBox MB_OK 'Оставляем в строке только слово "волшебник" . \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "вдруг" "волшебник" "в" "0" "1" "0"'

${StrSort} $3 "$0" "вдруг" "волшебник" "в" "0" "1" "0"
MessageBox MB_OK "Получаем в переменной : $3"

MessageBox MB_OK 'Оставляем в строке только слово "волшебник" и по одному маркерному слову перед и после слова "волшебник". \
$\r$\nДля этого устанавливаем :\
$\r$\n"String" "вдруг" "волшебник" "в" "1" "1" "1"'

${StrSort} $3 "$0" "вдруг" "волшебник" "в" "1" "1" "1"
MessageBox MB_OK "Получаем в переменной : $3"

SectionEnd

MKN
13-04-2012, 16:52
Нужно было организовать вызов MessageBox с последующим его автозакрытием черех n время.
Реализовал c помощью штатного плагина "Banner" так :

!include "WinMessages.nsh"
!include "MUI2.nsh"
!insertmacro MUI_LANGUAGE "English"

Name "Banner test"
OutFile "Banner Test.exe"

Section
MessageBox MB_OK "Сейчас будет вызвано сообщение, заданное в Function Mess1"
Call Mess1
SectionEnd

Function Mess1
Banner::show /set 76 "Сообщение длительностью=Sleep" "Здесь вторая строка сообщения"
Banner::getWindow
Pop $1
again:
IntOp $0 $0 + 1
Sleep 30
StrCmp $0 100 0 again
GetDlgItem $2 $1 1030
SendMessage $2 ${WM_SETTEXT} 0 "STR:Сообщение закрывается."
again2:
IntOp $0 $0 + 1
Sleep 5
StrCmp $0 200 0 again2
Banner::destroy
FunctionEnd

Section
SectionEnd

Есть ли иные, более изящные способы ?

K.A.V.
13-04-2012, 17:00
Нужно было организовать вызов MessageBox с последующим его автозакрытием черех n время. »
Не получится через NSIS, т.к. сообщение же ждёт пока пользователь нажмёт на кнопку :)
1. Либо вызывать из внешней DLL функцию показа кнопки
2. Либо взять и изменить плагин Banner (ResHacker'ом), отредактировать диалог и вызывать его уже со всеми заданными данными
Вот как в SFX Creator'e диалог "О программе", только там я какой то другой плагин изменял

P.S.
В баннере нет ресурса :D
Это другой плагин "баннера", посмотрю как он называется

MKN
13-04-2012, 17:06
Не получится через NSIS, т.к. сообщение же ждёт пока пользователь нажмёт на кнопку »
Можно автозакрывать "собственные" сообщения, как я уже показал выше (может и не совсем "культяписто", но работает :) ).
А вот с штатными, нужно поизгиляться, определяя параметры окна сообщения и вызывая автонажатие кнопки (кнопок) или , если возможно, сразу закрытие нужного окна.
Только это довольно-таки сложно и в коде, громоздко... И для сообщений будет уж очень нецелесообразно...

kotkovets
13-04-2012, 17:48
Нужно было организовать вызов MessageBox с последующим его автозакрытием черех n время » максимум штатными средствами можно и так:
!define MsgBoxTimeout "!insertmacro macro__MsgBoxTimeout"
!macro macro__MsgBoxTimeout text caption_text time
System::Call "user32::MessageBoxTimeout(i$HWNDPARENT, t`${text}`, t`${caption_text}`,i0,i0, i${time})"
!macroend

Section
${MsgBoxTimeout} "Сообщение закроется через 2 секунды" "MessageBoxTimeout" 2000
SectionEnd

wolkow70
14-04-2012, 16:36
Товарищи, подскажите как можно вычислить путь к папке плагинов FireFox
При установке 11-ой версии прописывается так.

HKEY_LOCAL_MACHINE "SOFTWARE\Mozilla\Mozilla Firefox 11.0\extensions" "Plugins" "$PROGRAMFILES\Mozilla Firefox\plugins"


Но мы не знаем заранее какая версия установлена (9,10,11 или другая....)
В общем нужно как-то записать в переменную значение параметра "Plugins" , чтобы скопировать плагин в эту папку.

kotkovets
14-04-2012, 17:15
wolkow70, макрос ${RegFind} из справки.
Section
${RegFind} "${HKLM}\SOFTWARE\Mozilla" "/T=REG_SZ /V=1" EnumReg
MessageBox MB_OK "$5" IDOK
SectionEnd

Function EnumReg
StrCpy $5 "$1" "" -10
${If} $5 == "extensions"
DetailPrint "$1"
DetailPrint "имя параметра: $2"
DetailPrint "значение параметра: $3"
StrCpy "$5" "$3"
StrCpy $0 StopRegFind
${EndIf}
FunctionEnd

wolkow70
14-04-2012, 17:53
wolkow70, макрос ${RegFind} из справки. »

Не получается, макрос нашел вот какой путь у меня:


[HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Thunderbird\Extensions]
"{eea12ec4-729d-4703-bc37-106ce9879ce2}"="E:\\Program Files\\Kaspersky Lab\\Kaspersky Internet Security 2011\\THBExt"
Тут нужно исключить ключ Thunderbird и Value должно быть "Plugins"

Можно еще найти путь к экзешнику, но это еще геморнее.

[HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 11.0\bin]
"PathToExe"="E:\\Program Files\\Mozilla Firefox\\firefox.exe"

bugmenotagain
14-04-2012, 21:21
Обязательно программу распаковывать в TEMP? Хочу как обычно, чтоб прямо из setup.exe устанавливать. Зачем ее куда то копировать.

А вот какие файлы подлежат распаковке, определяет команда File:


File"${pkgdir}\opera\1049.MST"
File"${pkgdir}\opera\opera installer.msi"
в учебнике написано. У меня вообще другая программа. Ну запускаю Opera там целая куча этих файлов и нет нужных.




© OSzone.net 2001-2012