Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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
kotkovets,
Это я знаю. Но это командная громозда с cmd.exe и т.д. , которой хотелось бы избежать. Неужели нет иных способов ?
kotkovets
12-04-2012, 12:21
Это я знаю. Но это командная громозда с cmd.exe и т.д. , которой хотелось бы избежать. Неужели нет иных способов ? »
причем здесь cmd? когда takeown, или nsExec - все скрытно
а че такие вопросы задаешь, думай как - вот тебе подсказка,
где можно при следущей перезагрузке прописать, что угодно
http://forum.oszone.net/post-1795270-1898.html
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 не идентифицирует себя как браузер по умолчанию.
${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
Нужно было организовать вызов 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
Есть ли иные, более изящные способы ?
Нужно было организовать вызов MessageBox с последующим его автозакрытием черех n время. »
Не получится через NSIS, т.к. сообщение же ждёт пока пользователь нажмёт на кнопку :)
1. Либо вызывать из внешней DLL функцию показа кнопки
2. Либо взять и изменить плагин Banner (ResHacker'ом), отредактировать диалог и вызывать его уже со всеми заданными данными
Вот как в SFX Creator'e диалог "О программе", только там я какой то другой плагин изменял
P.S.
В баннере нет ресурса :D
Это другой плагин "баннера", посмотрю как он называется
Не получится через 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC