Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
K.A.V.,
Согласен со всем тобой сказанным. И я не программист. Но уж очень интересно было бы воспроизвести и опробировать именно код.
мне проще dll написать »
А говоришь, не программист :)
kotkovets
06-11-2013, 18:32
Но уж очень интересно было бы воспроизвести и опробировать именно код »
!include MUI2.nsh
!define MUI_CUSTOMFUNCTION_GUIINIT GUIInit
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "Example.exe"
!define WS_CAPTION 0x00C00000
!define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
Push `${CONTROL}`
Push `${EXSTYLE}`
System::Store SR1R0
IntOp $R1 $R1 ~
System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
IntOp $R2 $R1 & $R2
System::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
System::Store L
!macroend
Function GUIInit
${NSD_RemoveStyle} $HWNDPARENT ${WS_CAPTION}
FunctionEnd
Section
SectionEnd
kotkovets,
Можно чуть подробнее о манипуляциях перед GetWindowLong и перед SetWindowLong ?
kotkovets
06-11-2013, 18:56
подробнее о манипуляциях перед GetWindowLong и перед SetWindowLong ? »
фиг его знает, я не программист.. :biggrin:
---
Необходимые логические манипуляции с числами: битовая логика (Битовые операции) И :)
что бы из окошка убрать указанную циферку - из полученой общей циферки (стиля окна)
http://ru.wikipedia.org/wiki/Битовые_операции
YoraG, А смысл? Сформулируйте цель. Что мешает сделать файл сразу ffg_old.exe?
Могу предложить создать некоторый файл, в который будет класться информация с некоторым индексом i, который будет каждый раз меняться при запуске файла.
Ну т.е. есть файл index.ini. При первом запуске его нет и он создается, после чего туда записывается цифра 1. Содержимое строки падает в переменную $R0. Файл в конце переименовывается в »
Смысл в том, что у пользователя всегда будет копия прежней версии программы, при установке новой. Если в последней версии программы обнаружатся ошибки, пользователь может временно работать в "ffg_old.exe" до исправления...
Вопрос так и не решился как выполнить команду
nsExec::Exec '"${NSISDIR}\какой то.cmd"'
Но что бы отображалось окно cmd?
По совету K.A.V., не получается http://forum.oszone.net/post-2247687-702.html
Так окно при каждом новом запуске окно получает новый дескриптор..и если писать так
nsExec::Exec '"${NSISDIR}\какой то.cmd"'
FindWindow $0 "" "Администратор:"
ShowWindow $0 1
То вторая и третья команда выполнятся уже после прекращения работы cmd и соотв. толку нет.
Мож есть какой то еше способ?
Как переименовать файл ffg.exe в ffg_old.exe перед установкой
Пишу
Цитата:
Section # "Файлы программы"
...
IfFileExists "$INSTDIR\ffg.exe" 0 +2
Rename $INSTDIR\ffg.exe $INSTDIR\ffg_old.exe
...
но выходит сначала устанавливает а потом переименовывает
Подскажите куда нужно поместить этот код »
На свой вопрос сам же и нашел простой ответ...
Кому нужно пользуйтесь:
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOW
Function SHOW
IfFileExists "$INSTDIR\ffg.exe" 0 +2
Rename $INSTDIR\ffg.exe $INSTDIR\ffg_old.exe
FunctionEnd
;действие будет выполнятся после выбора папки установки и нажатия кнопки "Установить"
kotkovets
06-11-2013, 22:06
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOW »
Это действие выполняется во время, когда страничка открыта..
;действие будет выполнятся после выбора папки установки и нажатия кнопки "Установить" »
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE SHOW
когда страничка закрывается
Limonica
07-11-2013, 00:13
Не ну серьезно, неужели нельзя установить новое устройство средствами NSIS?
kotkovets
07-11-2013, 00:43
Не ну серьезно, неужели нельзя установить новое устройство средствами NSIS? »
нет, только утилитой выше в silent режиме - дает гарантированный более-менее результат.
Возвращаясь к вопросу о скачивании файлов без плагинов.
Это можно сделать с помощью функции URLDownloadToFile
OutFile "URLDownloadToFile_test.exe"
; http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Section
StrCpy $1 "http://rarlab.com/rar/wrar500.exe"
StrCpy $2 "$temp\wrar500.exe"
System::Call 'urlmon::URLDownloadToFile(i0,tr1,tr2,i0,i0)i.r0'
DetailPrint HRESULT=$0 ; 0 - success
; если HRESULT=-2146697208 INET_E_AUTHENTICATION_REQUIRED (0x800C0009L or -2146697207)
; Authentication is needed to access the object. (Требуется авторизация для доступа к объекту)
SectionEnd
Я проверял работоспособность только на WinXP
Как переименовать файл ffg.exe в ffg_old.exe перед установкой
но выходит сначала устанавливает а потом переименовывает »
А в чём загвоздка ? Всё работает как надо, потому что нечему не работать... (если я правильно понял задачу) :
include "MUI2.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
OutFile "test-old_rename.exe"
InstallDir "$TEMP"
Section
IfFileExists "$INSTDIR\ffg.exe" 0 +2
Rename $INSTDIR\ffg.exe $INSTDIR\ffg_old.exe
SetOutPath "$INSTDIR"
File "ffg.exe"
SectionEnd
что бы отображалось окно cmd? »
Так окно консоли вроде как всегда маячит :
outfile cmd-test.exe
Section
; для наглядности содержимое cmd начни с Pause
ExecWait "$EXEDIR\file.cmd"
SectionEnd
Каким образом с помощью NSIS, реализовать Drag-and-drop для файлов-папок и самое интересное - для разных объектов-форм (кнопок и пр ) ?
Каким образом с помощью NSIS, реализовать Drag-and-drop для файлов-папок и самое интересное - для разных объектов-форм (кнопок и пр ) ? »
HandleFileDragDrop plug-in (http://nsis.sourceforge.net/HandleFileDragDrop_plug-in)
Только там вроде drag работает только на еденичный файл/папку, группой не получится перетащить
Сравнение времени создания файлов c помощью функции CompareFileTime
Section
StrCpy $R0 "File1"
StrCpy $R1 "File2"
System::Call 'kernel32::CompareFileTime(t R0,t R1) i.R2'
MessageBox MB_OK 'Сравнили файлы : $R0 и $R1 Результат сравнения : $R2'
SectionEnd
Если время создания $R0 и $R1 одинаково(равно) - в переменную $R2 возвращается 0,
Eсли $R0 создан раньше $R1 - возвращается -1,
Если $R1 создан раньше $R0 - возвращается 1
как сделать, чтобы инсталер не ждал окончания выполнения батника, командой nsExec::Exec ? Или есть другая команда для выполнения батника в скрытом режиме, с помощью которого инсталер не будет ждать его завершения ?
kotkovets
09-11-2013, 17:03
Или есть другая команда для выполнения батника в скрытом режиме, с помощью которого инсталер не будет ждать его завершения ? »
Убери в коде две "сдвинутые" :) команды #704 (http://forum.oszone.net/post-2247887-704.html)
Убери в коде две "сдвинутые" команды #704 »
Моя интуиция подсказывает, что эти две, правильно ?
System::Call "kernel32::WaitForSingleObject(ir1, i-1)"
System::Call "kernel32::CloseHandle(ir4)"
И еще один вопрос, как-то можно сгенерировать случайное число ?
И еще один вопрос, как-то можно сгенерировать случайное число ? »
Цитата из справки:
Автор: K.A.V.
На этой страничке я предоставлю вам код, с помощью которого вы сможете сгенерировать случайное число, указав необходимый диапазон чисел
В начале кода:
!define Rnd "!insertmacro _Rnd"
!macro _Rnd _RetVal_ _Min_ _Max_
Push "${_Max_}"
Push "${_Min_}"
Call Rnd
Pop ${_RetVal_}
!macroend
Добавляем функцию генерации случайного числа:
Function Rnd
Exch $0 ;; Min / return value
Exch
Exch $1 ;; Max / random value
Push "$3" ;; Max - Min range
Push "$4" ;; random value buffer
IntOp $3 $1 - $0 ;; calculate range
IntOp $3 $3 + 1
System::Call '*(l) i .r4'
System::Call 'advapi32::SystemFunction036(i r4, i 4)' ;; RtlGenRandom
System::Call '*$4(l .r1)'
System::Free $4
;; fit value within range
System::Int64Op $1 * $3
Pop $3
System::Int64Op $3 / 0xFFFFFFFF
Pop $3
IntOp $0 $3 + $0 ;; index with minimum value
Pop $4
Pop $3
Pop $1
Exch $0
FunctionEnd
И в любом месте кода вызываем функцию генерации числа:
${Rnd} $0 1 10
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC