Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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) - ИМХО ! устаревшая и неудобная вещь(плаг).
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}
Эт я в курсе! Но надо чтобы еще если выбран другой радиобутон $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}
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, может быть он что-нибудь сообразит :)
Добрый день!
подскажите как узнать есть ли у пользователя права администратора?
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC