PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 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

MKN
06-11-2013, 16:08
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

MKN
06-11-2013, 18:43
kotkovets,
Можно чуть подробнее о манипуляциях перед GetWindowLong и перед SetWindowLong ?

kotkovets
06-11-2013, 18:56
подробнее о манипуляциях перед GetWindowLong и перед SetWindowLong ? »
фиг его знает, я не программист.. :biggrin:
---
Необходимые логические манипуляции с числами: битовая логика (Битовые операции) И :)
что бы из окошка убрать указанную циферку - из полученой общей циферки (стиля окна)
http://ru.wikipedia.org/wiki/Битовые_операции

YoraG
06-11-2013, 19:04
YoraG, А смысл? Сформулируйте цель. Что мешает сделать файл сразу ffg_old.exe?
Могу предложить создать некоторый файл, в который будет класться информация с некоторым индексом i, который будет каждый раз меняться при запуске файла.
Ну т.е. есть файл index.ini. При первом запуске его нет и он создается, после чего туда записывается цифра 1. Содержимое строки падает в переменную $R0. Файл в конце переименовывается в »

Смысл в том, что у пользователя всегда будет копия прежней версии программы, при установке новой. Если в последней версии программы обнаружатся ошибки, пользователь может временно работать в "ffg_old.exe" до исправления...

diakov
06-11-2013, 20:36
Вопрос так и не решился как выполнить команду
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 и соотв. толку нет.
Мож есть какой то еше способ?

YoraG
06-11-2013, 21:02
Как переименовать файл 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 режиме - дает гарантированный более-менее результат.

MKN
07-11-2013, 10:20
Возвращаясь к вопросу о скачивании файлов без плагинов.
Это можно сделать с помощью функции 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

MKN
07-11-2013, 10:45
Как переименовать файл 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

MKN
07-11-2013, 13:34
что бы отображалось окно cmd? »
Так окно консоли вроде как всегда маячит :
outfile cmd-test.exe
Section
; для наглядности содержимое cmd начни с Pause
ExecWait "$EXEDIR\file.cmd"
SectionEnd

MKN
08-11-2013, 08:56
Каким образом с помощью NSIS, реализовать Drag-and-drop для файлов-папок и самое интересное - для разных объектов-форм (кнопок и пр ) ?

K.A.V.
08-11-2013, 13:33
Каким образом с помощью NSIS, реализовать Drag-and-drop для файлов-папок и самое интересное - для разных объектов-форм (кнопок и пр ) ? »
HandleFileDragDrop plug-in (http://nsis.sourceforge.net/HandleFileDragDrop_plug-in)
Только там вроде drag работает только на еденичный файл/папку, группой не получится перетащить

MKN
09-11-2013, 10:22
Сравнение времени создания файлов 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

vahe-91
09-11-2013, 14:57
как сделать, чтобы инсталер не ждал окончания выполнения батника, командой nsExec::Exec ? Или есть другая команда для выполнения батника в скрытом режиме, с помощью которого инсталер не будет ждать его завершения ?

kotkovets
09-11-2013, 17:03
Или есть другая команда для выполнения батника в скрытом режиме, с помощью которого инсталер не будет ждать его завершения ? »
Убери в коде две "сдвинутые" :) команды #704 (http://forum.oszone.net/post-2247887-704.html)

vahe-91
09-11-2013, 18:23
Убери в коде две "сдвинутые" команды #704 »
Моя интуиция подсказывает, что эти две, правильно ?
System::Call "kernel32::WaitForSingleObject(ir1, i-1)"
System::Call "kernel32::CloseHandle(ir4)"

И еще один вопрос, как-то можно сгенерировать случайное число ?

Salmo
09-11-2013, 19:15
И еще один вопрос, как-то можно сгенерировать случайное число ? »

Цитата из справки:
Автор: 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