Войти

Показать полную графическую версию : .: 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
27-02-2013, 18:03
Для определения оборудования в NSIS , используют обычно HwInfo plug-in (а других просто нет...) ( http://nsis.sourceforge.net/HwInfo_plug-in )
Но возможности его весьма убоги. Есть ещё CPUFeatures, определяет массу параметров CPU (почему то кроме названия проца... )
И похоже, что другого, тем более универсального, инструментария - нет...
Кое что конечно можно получить с помощью API и выудить из реестра... Только это довольно-таки громоздко в коде.
Например, определяем сетевой адаптер и некоторые его параметры :

OutFile "LanDetect.exe"
SetPluginUnload alwaysoff
!define maxsize 4096

Section
System::Alloc ${maxsize}
pop $3
System::Call 'iphlpapi::GetAdaptersInfo(i r3r4, *l ${maxsize} r2)i.r1'
;MessageBox MB_OK "GetAdaptersInfo return is $1"
System::Call '*$4(i.r4,i,&t260.r5, &t132.r6, i.r7, l.r8)'
Math::Script "hex={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};"
Math::Script "s=''; a=r8; b=r7; #{b-->0,s=s+hex[a/16%16]+hex[a%16]+#[b>0,'-','']; a=a/256;}; r9=s;"
MessageBox MB_OK "Adapter name is $5$\ndesc $6$\naddr len $7$\naddr $8$\nMacAddr: $9"
System::Free 0
Math::Script ""
SectionEnd

Или вот хороший способ получить информацию о памяти :

OutFile "MemInfo.exe"
Section
System::Alloc 64
Pop $1
System::Call "*$1(i64)"
; Функция GlobalMemoryStatus позволяет получить информацию про текущее использование системой как физической, так и ;виртуальной памяти.
;Информация, возвращаемая функцией GetMemoryStatusEx, постоянно изменяется. Нет никакой гарантии, что два последовательных ;вызова этой функции вернут одинаковые значения.
System::Call "Kernel32::GlobalMemoryStatusEx(i r1)"
System::Call "*$1(i.r2, i.r3, l.r4, l.r5, l.r6, l.r7, l.r8, l.r9, l.r10)"
System::Free $1
; convert the Total Physical Memory which is in bytes to Mbytes
System::Int64Op $4 / 1048576
Pop $4
System::Int64Op $5 / 1048576
Pop $5
System::Int64Op $6 / 1048576
Pop $6
System::Int64Op $7 / 1048576
Pop $7
System::Int64Op $8 / 1048576
Pop $8
System::Int64Op $9 / 1048576
Pop $9
MessageBox MB_OK "Structure size: $2 bytes"
MessageBox MB_OK "Memory load: $3%"
MessageBox MB_OK "Total physical memory: $4 Mb"
MessageBox MB_OK "Free physical memory: $5 Mb"
MessageBox MB_OK "Total page file: $6 Mb"
MessageBox MB_OK "Free page file: $7 Mb"
MessageBox MB_OK "Total virtual: $8 Mb"
MessageBox MB_OK "Free virtual: $9 Mb"
SectionEnd

В то же время, для целей получения разнообразной информации, существует занятный Header http://nsis.sourceforge.net/WMI_header
Возможности его широки и не объятны, только не понимает он к сожалению по русски.
К примеру, при определении сетевых адаптеров, видим сплошные кракозябры в описании...

OutFile WMI.exe
RequestExecutionLevel Admin
!include MUI2.nsh
!include WMI.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE "English"

Section "test"
#List network adapters:
${WMIGetInfo} root\CIMV2 Win32_NetworkAdapter name callback_Function
SectionEnd

Function callback_Function
#$R0 = result number, $R1 = total results, $R2 = result name
detailprint "$R0/$R1=$R2"
FunctionEnd

Можно ли это как то исправить ?

Aster
28-02-2013, 13:11
Друзья, насколько НСИС дружит с Вин8 ?
Возможно вопрос уже задавался... Если что, извиняюсь...

MKN
28-02-2013, 13:40
насколько НСИС дружит с Вин8 ? »
NSIS скрипты в W8 работают нормально.

Aster
28-02-2013, 13:53
MKN, благодарю, не подскажете ещё, взаимодействия с реестром также корректно работают? Создание ключей, удаление ключей в реестре и т.д

MKN
28-02-2013, 15:06
Aster,
Быстрее и проще проверить самому. :) И с реестром всё хорошо работает. Что и как сделаешь, то и получишь. :)
Делай всё согласно доку и нашему Справочнику - и всё будет так, как надо.

K.A.V.
28-02-2013, 16:30
Возможности его широки и не объятны, только не понимает он к сожалению по русски. »
Можно ли это как то исправить ? »
Смари сюда :)

Function callback_Function
#$R0 = result number, $R1 = total results, $R2 = result name
System::Call "user32::OemToChar(tR2, t.r2)"
detailprint "$R0/$R1=$R2"
FunctionEnd

В переменную $2 будет скидываться перекодированная строка :)

MKN
28-02-2013, 16:40
В переменную $2 будет скидываться перекодированная строка »
Не.. Всё как было так и осталось... И чего делать ? (У меня так... Позже на другой машине проверю)

K.A.V.
28-02-2013, 17:40
Не.. Всё как было так и осталось... И чего делать ? (У меня так... Позже на другой машине проверю) »
Может ты в переменных попутал чего? У меня всё норм преобразовывает...Перекидывает не в $R2, а в $2

http://s2.ipicture.ru/uploads/20130228/eHBIMf2Y.jpg

MKN
28-02-2013, 17:45
Перекидывает не в $R2, а в $2 »
Точно, попутал. Теперь всё ОК.

Давно интересует такой вопрос - может ли NSIS работать с окнами класса Internet Explorer_Server ? (Это что то связанное с GetIHTMLDocument2 )
( К примеру, Corel их вовсю применяет в своих инсталлерах , да и др. ПО тоже. )

Valdise
01-03-2013, 10:09
Как на доп. странице выбора компонентов, группы чекбоксов связать с Радиокнопками? »Ни кто мыслишки не подкинул, так что самого Муза посетила :yes:
http://i53.fastpic.ru/big/2012/1222/65/cbafd4f7e6d1b5201cd391da23671965.png
;-Создание ярлыков из INI-файла
;-!Радиокнопка ВСЕМ
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "io_Shortcut_XXX.ini" "Field 3" "State"
StrCmp $INI_VALUE "1" "" +2
SetShellVarContext all ;current- для текущего ПО УМОЛЧАНИЮ!!!
;-!Радиокнопка ТЕКУЩЕМУ
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "io_Shortcut_XXX.ini" "Field 4" "State"
StrCmp $INI_VALUE "1" "" +2
SetShellVarContext current
Т.е при выборе одной из радиокнопок сценарий переключается для одного из - all или current
P.S Может кому понадобится, поэтому хвастаюсь :)

MKN
01-03-2013, 17:21
Изменяем стандартную страницу выбора компонентов PAGE_COMPONENTS без правки ресурсов


!define PRODUCT_NAME "COMPONENTSPRE"
!define PRODUCT_VERSION "1.0"
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "COMPONENTSPRE.exe"
InstallDir "$TEMP"
!include "MUI2.nsh"

!define SWP_SHOWWINDOW 0x00000040

!define MUI_PAGE_HEADER_TEXT "Текст 1"
!define MUI_PAGE_HEADER_SUBTEXT "Текст 2"
!define MUI_COMPONENTSPAGE_TEXT_TOP "Текст 3"

!define MUI_PAGE_CUSTOMFUNCTION_PRE COMPPRE
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SETCTLPOS
!insertmacro MUI_PAGE_COMPONENTS

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section "Section1" SEC01
SectionEnd

Section "Section2" SEC02
SectionEnd

Section "Section3" SEC03
SectionEnd

Function COMPPRE
SectionSetText ${SEC01} "Component1"
SectionSetText ${SEC02} "Component2"
SectionSetText ${SEC03} "Component3"
FunctionEnd

Function SETCTLPOS
FindWindow $R0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $R0 1021
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1022
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1023
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1042
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1043
System::Call 'user32::DestroyWindow(ir0)'
GetDlgItem $0 $R0 1017
System::Call "user32::SetWindowPos(ir0,i0,i0,i30,i450,i180,i${SWP_SHOWWINDOW})"
GetDlgItem $0 $R0 1032
System::Call "user32::SetWindowPos(ir0,i0,i0,i52,i450,i158,i${SWP_SHOWWINDOW})"
FunctionEnd

MKN
01-03-2013, 18:20
Подскажите пожалуйста - как с помощью WMI вызова узнать версию файла шрифта ?
(вроде бы надо как то использовать Win32_FontInfoAction Version. Но как ? )

kotkovets
02-03-2013, 12:41
(вроде бы надо как то использовать Win32_FontInfoAction Version. Но как ? ) »
можно так в скрипте vbs:
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_FontInfoAction",,48)
For Each objItem in colItems
Wscript.Echo "ActionID: " & objItem.ActionID
Wscript.Echo "Caption: " & objItem.Caption
Wscript.Echo "Description: " & objItem.Description
Wscript.Echo "Direction: " & objItem.Direction
Wscript.Echo "File: " & objItem.File
Wscript.Echo "FontTitle: " & objItem.FontTitle
Wscript.Echo "Name: " & objItem.Name
Wscript.Echo "SoftwareElementID: " & objItem.SoftwareElementID
Wscript.Echo "SoftwareElementState: " & objItem.SoftwareElementState
Wscript.Echo "TargetOperatingSystem: " & objItem.TargetOperatingSystem
Wscript.Echo "Version: " & objItem.Version
Next
хотя версия не возвращается почему-то и там и там.. работает практически аналогично..
эксперементально на nsis

MKN
02-03-2013, 13:08
kotkovets,
А как натравить скрипт на конкретный TTF ? (рядом находящиеся не видит...)
И очень очень долго идёт обработка (у меня минуты три, а что находит - не понятно...)
Вот так после обработки :

===============root\CIMV2=====================
GlobalUserInterface.CompositeFont{A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7}
Global User Interface
GlobalUserInterface.CompositeFont
=======
GlobalSerif.CompositeFont{A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7}
Global Serif
GlobalSerif.CompositeFont
=======
GlobalSansSerif.CompositeFont{A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7}
Global Sans Serif
GlobalSansSerif.CompositeFont
=======
GlobalMonospace.CompositeFont{A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7}
Global Monospace
GlobalMonospace.CompositeFont
=======
===================end======================
Готово

Может WMI вообще не пригоден для работы с шрифтами ? И может использовать API FontResource функции ? Правда никто не знает как...

kotkovets
02-03-2013, 13:36
А как натравить скрипт на конкретный TTF ? »
по ходу только трассируется по умолчанию шрифт..
я не спец по vbs..
спроси в другой теме..
попробую перевести на nsis , ну если узнаешь как на VBS делать..:)

Waterclo
03-03-2013, 08:41
MKN, спасибо всё получилось, как я хотел.
!insertmacro MsgBox $0 " Текст сообщения " " Заголовок " 0x40|0x1 »
Один вопрос остался, как в " Текст сообщения ", если он окажется очень длинным, сделать перенос строк? С символом "\n" не получается.

MKN
03-03-2013, 10:47
С символом "\n" не получается. »
Используй $\r$\n

diakov
03-03-2013, 13:53
Подскажите как выйти из ситуации, вот код:

Function ClickButton
pop $btn
IfFileExists "$SYSDIR\drivers\sptd.sys" 0 NotFiles
MoreInfo::GetFileVersion "$SYSDIR\drivers\sptd.sys"
Pop $1
${StrFilter} "$1" "1" "." "()" $0
MessageBox MB_ICONEXCLAMATION|MB_OK "Версия $0"
Goto Done
NotFiles:
MessageBox MB_ICONEXCLAMATION|MB_OK "Нет файла"
Done:
FunctionEnd

Если на 32 системе то показывает версию, а если на 64 то нет, хотя сам файл в папке на х64 проводник видет.

MKN
03-03-2013, 15:48
diakov,
возможно дело в Redirection (перенаправлении)
попробуй в Function .onInit :
${If} ${RunningX64}
${DisableX64FSRedirection} # или ${EnableX64FSRedirection}
${EndIf}

diakov
04-03-2013, 21:34
Подскажите такое, есть код:

Function ClickButton1
pop $btn1
IfFileExists "$SYSDIR\drivers\sptd.sys" 0 NotFiles
MoreInfo::GetFileVersion "$SYSDIR\drivers\sptd.sys"
Pop $1
${StrFilter} "$1" "1" "." "()" $0
MessageBox MB_USERICON|MB_YESNO 'Обнаружена установленная версия драйвера SPTD $0.$\n Хотите обновить драйвер до версии 1.83? $\n$\n (В конце установки ПК будет автоматически перезагружен.)' /SD IDYES IDNO Done
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
MessageBox MB_ICONEXCLAMATION|MB_OK "После нажатия на кнопку ОК компьютер автоматически перезагрузится."
Reboot
Goto Done
NotFiles:
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
MessageBox MB_ICONEXCLAMATION|MB_OK "После нажатия на кнопку ОК компьютер автоматически перезагрузится."
Reboot
Done:
FunctionEnd

НО, после нажатия на кнопку ОК перезагрузка не происходит, комп перезагружается только после того как закрыть установщик вручную! Как быть?




© OSzone.net 2001-2012