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
24-05-2012, 16:30
Чтобы так не извращаться... »
В справке в указателе вводим - LineFind
OutFile "example.exe"
!include "MUI2.nsh"
!include "TextFunc.nsh"
ShowInstDetails show
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

Section
${LineFind} "$EXEDIR\file.txt" "" "1:-1" "LineRead"
IfErrors 0 +3
MessageBox MB_OK "Файла не существует!" IDOK
Abort

MessageBox MB_OK "$R1" IDOK
SectionEnd

Function LineRead
DetailPrint $R9
StrCpy $R0 $R9 4
${IfThen} $R0 == 0400 ${|} StrCpy $R1 $R0 ${|}
Push $0
FunctionEnd

wolkow70
25-05-2012, 09:11
Сделал так:

!define MUI_PAGE_CUSTOMFUNCTION_PRE PRELICENSE
!define MUI_PAGE_CUSTOMFUNCTION_PRE PRESTARTMENU

Function PRELICENSE
${If} $GMODE = 1
Abort
${EndIf}
FunctionEnd

Function PRESTARTMENU
${If} $GMODE = 1
Abort
${EndIf}
FunctionEnd
Теперь думаю как сделать , чтобы при $GMODE = 1

на финишной странице не отображалось:
!define MUI_FINISHPAGE_RUN "$INSTDIR\winamp.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Запустить Winamp"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
и не выполнялось:
!define MUI_FINISHPAGE_NOAUTOCLOSE


При этом имеется функция :

Function SHOWFINISH
${If} $GMODE = 1
${NSD_SetText} $mui.FinishPage.Title "Завершение работы Мастера создания файла ответов."
${NSD_SetText} $mui.FinishPage.Text "Файл ответов готов!"
${EndIf}
FunctionEnd

Кто-нибудь подскажет?

kotkovets
25-05-2012, 12:10
Кто-нибудь подскажет? »
Меняйте значение $GMODE и увидете разницу...
OutFile "example.exe"
!include "MUI2.nsh"
ShowInstDetails show

var GMODE
!define MUI_FINISHPAGE_RUN "$EXEDIR\winamp.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Запустить Winamp"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
!define MUI_FINISHPAGE_NOAUTOCLOSE

!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE INSTFILESLEAVE
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWFINISH
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE Russian

Section
StrCpy $GMODE 1
SectionEnd

Function INSTFILESLEAVE
StrCmp $GMODE 1 0 +2
SetAutoclose true
FunctionEnd

Function SHOWFINISH
${If} $GMODE == 1
ShowWindow $mui.FinishPage.Run ${SW_HIDE}
${NSD_SetText} $mui.FinishPage.Title "Завершение работы Мастера создания файла ответов."
${NSD_SetText} $mui.FinishPage.Text "Файл ответов готов!"
${EndIf}
FunctionEnd

wolkow70
25-05-2012, 12:32
kotkovets,

Да, работает.

Я было пошел по другому пути, нашел где-то так:

Функция Show_PageFinish_custom

GetDlgItem $ R9 $ MUI_HWND 1203;

ShowWindow $ R9 $ {} SW_HIDE

MessageBox MB_OK $ R9

# MessageBox MB_OK $ MUI_HWND

FunctionEnd

Но нужно было узнать номер поля из ioSpecial.ini , но я у себя такого файла не нашел во временной папке NSIS.

kotkovets
25-05-2012, 13:12
Но нужно было узнать номер поля из ioSpecial.ini , »
MUI2 (nsdialogs.dll) не использует ioSpecial.ini,
его использует MUI (InstallOptions.dll) - ИМХО ! устаревшая и неудобная вещь(плаг).

diakov
26-05-2012, 11:59
kotkovets, подскажи


Section "-установка"
${If} $Check == 1
${If} $Radio == 1
${AndIf} ${RunningX64}
CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\TOTALCMD64.EXE"
${Else}
CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\TOTALCMD.EXE"
${EndIf}
${If} $Radio1 == 1
CreateShortCut "$Desktop\${PRODUCT_NAME}.lnk" "$INSTDIR\TOTALCMD.EXE"
${EndIf}
${EndIf}
SectionEnd


Вообщем надо что бы если отмечен чек и радиобутон то на системе х64 ярлык был TOTALCMD64.EXE а на х86 TOTALCMD.EXE, а если отмечен чек и радиобутон1 то на любой системе создавалсо TOTALCMD.EXE!

kotkovets
26-05-2012, 13:30
kotkovets, подскажи »
${If} $Check == 1
${AndIf} $Radio == 1
${If} ${RunningX64}
MessageBox MB_OK "TOTALCMD64.EXE"
${Else}
MessageBox MB_OK "TOTALCMD.EXE"
${EndIf}
${EndIf}

diakov
26-05-2012, 13:36
Эт я в курсе! Но надо чтобы еще если выбран другой радиобутон $Radio1 и этот же чекбокс и на х86 и на х64 создавался ярлык на файл TOTALCMD.EXE!

kotkovets
26-05-2012, 13:42
Эт я в курсе! Но надо чтобы еще если выбран другой радиобутон $Radio1 »

${If} $Check == 1
${AndIf} $Radio == 1
${If} ${RunningX64}
MessageBox MB_OK "TOTALCMD64.EXE"
${Else}
MessageBox MB_OK "TOTALCMD.EXE"
${EndIf}
${ElseIf} $Radio1 == 1
${AndIf} $Check == 1
MessageBox MB_OK "Radio1: TOTALCMD.EXE"
${EndIf}

diakov
27-05-2012, 12:38
kotkovets, как сделать в nsDialogs такую рамку например вокруг групи чекбоксов?


http://s019.radikal.ru/i631/1205/73/40bbe157f644.jpg

kotkovets
27-05-2012, 13:03
такую рамку например вокруг групи чекбоксов? »
${NSD_CreateGroupBox} — контейнер группы

Olef2387
27-05-2012, 14:06
kotkovets, добрый день.
Вот здесь вы отвечали на мой вопрос о выборе одного компонента из группы секций
http://forum.oszone.net/showpost.php?p=1915688&postcount=2705

Пожалуйста, скажите как теперь создать секцию, которая не зависела бы никак от группы секций, где предусмотрен выбор одного компонента.

А то сейчас получается так, что при установке флажка на новую секцию, автоматически устанавливается флажок и на группе секций... Мне же нужно, чтобы при установке флажка на созданную секцию флажок на группу не ставился бы, т.к в группе секций пользователь должен сам отметить нужный компонент.... А сейчас код настроен таким образом, что считываются абсолютно все секции, включая ту, которую я бы хотел сделать независимой.
Вот ниже ваш код, где я добавил независящую секцию (курсивом выделил)... Если Вас не затруднит - подправьте в коде что необходимо для реализации моей просьбы. Большое спасибо.

OutFile "example.exe"

var hInst

!include "MUI2.nsh"

!insertmacro MUI_PAGE_WELCOME
;функция во время открытия странички компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
;---------------------------------------------------
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

;макрос проверки секций, если одна из секций отмечена возврат - 1, иначе - 0;
;в intsec - указываем количество секций в скрипте
!macro CheckSection intsec ret
Push ${intsec}
System::Store SR2
${For} $R0 1 $R2
SectionGetFlags $R0 $R1
${IfThen} $R1 == 1 ${|}${Break}${|}
${Next}
Push $R1
System::Store L
Pop ${ret}
!macroend

Section /o "Независящая секция" FREE
SectionEnd

SubSection /e test IDS_1

Section /o "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section /o "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd

SubSectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro RadioButton ${ID_4}
!insertmacro RadioButton ${ID_5}
!insertmacro RadioButton ${ID_6}
!insertmacro EndRadioButtons
!insertmacro CheckSection 6 $R0
StrCmp $R0 0 0 +2
EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
StrCmp $R0 1 0 +2
EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd

Function .OnInit
StrCpy $1 ${ID_1}
SectionSetFlags ${IDS_1} ${SECTION_OFF} ;фиктивно отключаем группу
FunctionEnd

Function COMPONENTS_SHOW
GetDlgItem $hInst $HWNDPARENT 1 ;находим HWND кнопки "установить"
!insertmacro CheckSection 6 $R0
StrCmp $R0 0 0 +2
EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
StrCmp $R0 1 0 +2
EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd

kotkovets
27-05-2012, 15:38
Olef2387, ничего дальше путного, стандартными методами не получится...
для этого нужно плаг писать - нет желания.

Olef2387
27-05-2012, 16:52
Хорошо, ну всё равно спасибо.
Подожду K.A.V'a, может быть он что-нибудь сообразит :)

dix75
28-05-2012, 16:47
Добрый день!
подскажите как узнать есть ли у пользователя права администратора?
IsUserAdmin утверждается, что старый макрос
что испольщовать сейчас?

kotkovets
28-05-2012, 17:52
IsUserAdmin утверждается, что старый макрос »
бред!
---
в справочнике --> UserInfo: Определение типа учетной записи и правами
по этому же движку работает плаг, тока удобнее пользоваться.

wolkow70
29-05-2012, 14:40
kotkovets,
подскажите пожалуйста в чем допущена ошибка?
Сделал так:

Function Find
StrCpy $R0 $R8
StrCpy $R1 $R9
Push $0
FunctionEnd
;
Function .OnInit
StrCpy $WindowCaption "Установка CyberLink Decoder Pack 2012"
;
${Locate} "$PROGRAMFILES\CyberLink" "/L=F /M=PowerDVD* /S=" "Find"
;
IfErrors Next
MessageBox MB_OK "$$R0=$R0"
MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST "На этом компьютере установлен программый продукт CyberLink PowerDVD,$\nили имеются сохраненные файлы этого Приложения.$\nДанный пакет не предназначен для инсталляции в систему с установленной$\nпрограммой CyberLink PowerDVD.$\nУстановка CyberLink Decoder Pack 2012 будет прекращена"
Abort
Next:
FunctionEnd

В именах устанавливаемых файлов отсутствует PowerDVD, тем не менее сообщение выводится.
При деинсталляции и новой установке все нормально.
Реагирует на наличие любого файла в папке.
Сообщение выводится $R0=

kotkovets
29-05-2012, 19:11
подскажите пожалуйста в чем допущена ошибка? »
ни в чем, вы неверно сами себе интерпретировали задачу, флаг ошибки возникает, если
указанной папки для поиска - не существует, а если папка пуста, то флага ошибки нет.
Соответственно в переменной $R0, после завершения работы макроса, оказывается последнее значение
(функция Find вызывается в макросе циклически, пока не будет найден последний файл), а если папка пуста ???!!!

wolkow70
29-05-2012, 22:50
а если папка пуста, то флага ошибки нет »

Я старался по справке делать.

Section
${Locate} "C:\ftp" "/L=F /M=RPC DCOM.rar /S=1K" "Example1"
; Поиск 'RPC DCOM.rar' файла в папке 'C:\ftp' с размером 1 Kb или больше

IfErrors 0 +2
MessageBox MB_OK "Ошибка" IDOK +2
MessageBox MB_OK "$$R0=$R0"
SectionEnd

Function Example1
StrCpy $R0 $R9
; $R0="C:\ftp\files\RPC DCOM.rar"

MessageBox MB_YESNO '$R0$\n$\nИскать дальше?' IDYES +2
StrCpy $0 StopLocate

Push $0
FunctionEnd
Задача таким образом поставлена, если в папке есть файлы в имени которых содержится PowerDVD, то установка прекращается.

kotkovets
29-05-2012, 23:13
Задача таким образом поставлена, если в папке есть файлы в имени которых содержится PowerDVD, то установка прекращается »
Не видно и не пахнет такой задачей.
да еще размерам файлы равным 1024 байтам (/S=1K) ?
делается очень просто, если папка есть(или нет), но нет файлов нужных - $R0 = 0, иначе в $R0 количество найденных файлов
Function Find
IntOp $R0 $R0 + 1
Push $0
FunctionEnd

Section
StrCpy $R0 0
ClearErrors
${Locate} "C:\ftp" "/L=F /M=PowerDVD*" "Find"
Iferrors 0 +2
MessageBox MB_OK "Папки нет такой!" IDOK
MessageBox MB_OK "$R0" IDOK
SectionEnd
Дальше банальное сравнение значения $R0 и вытекающими действиями.




© OSzone.net 2001-2012