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
30-09-2013, 09:27
существуют же не только N редакции но и K и KN как быть с ними? »
Никак. :) Это же редкая экзотика... Особенно К (для Кореи) http://it-padla.blogspot.ru/2009/08/windows-7.html
Да и основное отличие от нормальных редакций - в отсутствии Windows Media Player. И уж не WinVer.nsh должен это отличие детектировать...

Для практики, в подавляющем большинстве случаев, вполне достаточно исчерпывающей информации из
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
Извлёк нужную инфу, сравнил и сделал вывод. По Win 8 включительно, почти все данные об ОС известны...
Например, http://en.wikipedia.org/wiki/Comparison_of_Microsoft_Windows_versions
http://en.wikipedia.org/wiki/Development_of_Windows_7

ProcessFunc.nsh недавно выложенная тоже не работает в самой последней версии »
Если имеется ввиду хедер из моего поста, то это альтернативный вариант, причём, для некоторых случаев, не совсем удачный...
А хедер от kotkovets (который в справочнике) работает ?

ps Для разнообразия, последние летние WinVer.nsh

kotkovets
30-09-2013, 19:16
kotkovets, есть ли обнова WinVer2.nsh c правильным отображением Windows 8 и 8.1 ? »
скоро будет.. выложу..
ProcessFunc.nsh недавно выложенная тоже не работает в самой последней верси »
не надо... все работает..

MKN
01-10-2013, 17:39
Код программы "Font Viewer" :
(от китайских товарищей. Перевод гугловский, может быть не точен... )

!include MUI2.nsh
!include nsWindows.nsh
!include WinCore.nsh

!define BS_SOLID 0
!define BS_NULL 1
!define TRANSPARENT 1
!define OPAQUE 2
!define CC_TEXT 1
!define CC_BK 4
!define CC_BKB 16
!define GWL_USERDATA -21

!define CF_SCREENFONTS 0x00000001
!define CF_PRINTERFONTS 0x00000002
!define CF_BOTH ${CF_SCREENFONTS}|${CF_PRINTERFONTS}
!define CF_SHOWHELP 0x00000004
!define CF_ENABLEHOOK 0x00000008
!define CF_ENABLETEMPLATE 0x00000010
!define CF_ENABLETEMPLATEHANDLE 0x00000020
!define CF_INITTOLOGFONTSTRUCT 0x00000040
!define CF_USESTYLE 0x00000080
!define CF_EFFECTS 0x00000100
!define CF_APPLY 0x00000200
!define CF_ANSIONLY 0x00000400
#if(WINVER >= 0x0400)
!define CF_SCRIPTSONLY ${CF_ANSIONLY}
#endif /* WINVER >= 0x0400 */
!define CF_NOVECTORFONTS 0x00000800
!define CF_NOOEMFONTS ${CF_NOVECTORFONTS}
!define CF_NOSIMULATIONS 0x00001000
!define CF_LIMITSIZE 0x00002000
!define CF_FIXEDPITCHONLY 0x00004000
!define CF_WYSIWYG 0x00008000 #// must also have CF_SCREENFONTS & CF_PRINTERFONTS
!define CF_FORCEFONTEXIST 0x00010000
!define CF_SCALABLEONLY 0x00020000
!define CF_TTONLY 0x00040000
!define CF_NOFACESEL 0x00080000
!define CF_NOSTYLESEL 0x00100000
!define CF_NOSIZESEL 0x00200000
#if(WINVER >= 0x0400)
!define CF_SELECTSCRIPT 0x00400000
!define CF_NOSCRIPTSEL 0x00800000
!define CF_NOVERTFONTS 0x01000000
#endif /* WINVER >= 0x0400 */

!define BOLD_FONTTYPE 0x0100
!define ITALIC_FONTTYPE 0x0200
!define REGULAR_FONTTYPE 0x0400
!define SCREEN_FONTTYPE 0x2000
!define PRINTER_FONTTYPE 0x4000
!define SIMULATED_FONTTYPE 0x8000

!define CF_TEXT 1
!define CF_BITMAP 2
!define CF_METAFILEPICT 3
!define CF_SYLK 4
!define CF_DIF 5
!define CF_TIFF 6
!define CF_OEMTEXT 7
!define CF_DIB 8
!define CF_PALETTE 9
!define CF_PENDATA 10
!define CF_RIFF 11
!define CF_WAVE 12
!define CF_UNICODETEXT 13
!define CF_ENHMETAFILE 14
!define CF_HDROP 15
!define CF_LOCALE 16
!define CF_DIBV5 17

!define CF_PRIVATEFIRST 0x0200
!define CF_PRIVATELAST 0x02FF
!define CF_GDIOBJFIRST 0x0300
!define CF_GDIOBJLAST 0x03FF
!define CF_OWNERDISPLAY 0x0080
!define CF_DSPTEXT 0x0081
!define CF_DSPBITMAP 0x0082
!define CF_DSPMETAFILEPICT 0x0083
!define CF_DSPENHMETAFILE 0x008E

!define GMEM_FIXED 0x0000
!define GMEM_MOVEABLE 0x0002
!define GMEM_ZEROINIT 0x0040
!define GPTR ${GMEM_FIXED}|${GMEM_ZEROINIT}
!define GHND ${GMEM_MOVEABLE}|${GMEM_ZEROINIT}

Name ChooseFont
Caption ChooseFont
OutFile ChooseFont.exe
XPStyle on

Page custom Page.Create
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Var HWND

Function Page.Create

!insertmacro MUI_HEADER_TEXT "ChooseFont Function" "ChooseFont"

nsDialogs::Create 1018
Pop $HWND

nsDialogs::CreateControl ${__NSD_Label_Class} ${__NSD_Label_STYLE}|${SS_CENTER}|${SS_CENTERIMAGE} \
${WS_EX_CLIENTEDGE}|${WS_EX_WINDOWEDGE} 0u 0u 300u 50u "Просмотр шрифта"
Pop $0

${NSD_CreateButton} 250u 54u 50u 14u "Шрифт"
Pop $1
${NSD_OnClick} $1 ChooseFont

${NSD_CreateLabel} 0u 57u 80u 8u "LOGFONT : "
Pop $3
${NSD_CreateLabel} 80u 57u 20u 8u ""
Pop $3

${NSD_CreateLabel} 72u 72u 78u 8u ""
Pop $3
${NSD_CreateLabel} 222u 72u 78u 8u ""
Pop $3
${NSD_CreateLabel} 72u 82u 78u 8u ""
Pop $3
${NSD_CreateLabel} 222u 82u 78u 8u ""
Pop $3
${NSD_CreateLabel} 72u 92u 78u 8u ""
Pop $3
${NSD_CreateLabel} 222u 92u 78u 8u ""
Pop $3
${NSD_CreateLabel} 72u 102u 78u 8u ""
Pop $3
${NSD_CreateLabel} 222u 102u 78u 8u ""
Pop $3
${NSD_CreateLabel} 72u 112u 78u 8u ""
Pop $3
${NSD_CreateLabel} 222u 112u 78u 8u ""
Pop $3
${NSD_CreateLabel} 72u 122u 78u 8u ""
Pop $3
${NSD_CreateLabel} 222u 122u 78u 8u ""
Pop $3
${NSD_CreateLabel} 72u 132u 78u 8u ""
Pop $3
${NSD_CreateLabel} 222u 132u 78u 8u ""
Pop $3

${NSD_CreateLabel} 0u 72u 72u 8u "iPointSize: "
Pop $3
${NSD_CreateLabel} 150u 72u 72u 8u "rgbColors: "
Pop $3
${NSD_CreateLabel} 0u 82u 72u 8u "lfEscapement: "
Pop $3
${NSD_CreateLabel} 150u 82u 72u 8u "lfOrientation: "
Pop $3
${NSD_CreateLabel} 0u 92u 72u 8u "lfWeight: "
Pop $3
${NSD_CreateLabel} 150u 92u 72u 8u "lfItalic: "
Pop $3
${NSD_CreateLabel} 0u 102u 72u 8u "lfUnderline: "
Pop $3
${NSD_CreateLabel} 150u 102u 72u 8u "lfStrikeOut: "
Pop $3
${NSD_CreateLabel} 0u 112u 72u 8u "lfCharSet: "
Pop $3
${NSD_CreateLabel} 150u 112u 72u 8u "lfOutPrecision: "
Pop $3
${NSD_CreateLabel} 0u 122u 72u 8u "lfClipPrecision: "
Pop $3
${NSD_CreateLabel} 150u 122u 72u 8u "lfQuality: "
Pop $3
${NSD_CreateLabel} 0u 132u 72u 8u "lfPitchAndFamily: "
Pop $3
${NSD_CreateLabel} 150u 132u 72u 8u "lfFaceName: "
Pop $3

${NSD_CreateText} 100u 55u 145u 12u "Образец"
Pop $3
${NSD_OnChange} $3 SetSampleText

nsDialogs::Show
FunctionEnd

Function ChooseFont

IntCmpU 0 $R0 0 +5
#Создать структуру LOGFONT
; GetDC извлекает дескриптор дисплейного контекста устройства (DC) для рабочей области заданного окна или для всего экрана
;(Идентифицирует контекст устройства для CWnd клиентской области)
System::Call `user32::GetDC(in)i.s`
; GetDeviceCaps извлекает зависимую от устройства информацию для заданного устройства
; LOGPIXELSX Число пикселей на логический дюйм по экранной ширине. В системе с многоэкранными мониторами, это значение одно и то же для всех мониторов.
System::Call `gdi32::GetDeviceCaps(is,i${LOGPIXELSX})i.s`

; Умножение двух 32-битных значений, а затем делит 64-битный результат на треть 32-битное значение.
;Окончательный результат округляется до ближайшего целого числа.
System::Call `kernel32::MulDiv(i9,is,i72)i.s`
System::Call `*(is,i,i,i,i,&i1,&i1,&i1,&i1,&i1,&i1,&i1,&i1,&t32"Tahoma")i.R0`

#Создать структуру CHOOSEFONT
System::Call `*(i60,i$HWNDPARENT,i20,iR0,i,i${CF_INITTOLOGFONTSTRUCT}|${CF_BOTH}|${CF_EFFECTS}|${CF_NOVERTFONTS}| ${CF_NOOEMFONTS},ir4,i,i,i,i,i,&i2,i,i)i.R1`
System::Call `comdlg32::ChooseFont(iR1)i.r2`
IntCmp $2 0 end

#Пользователь выбирает выходные параметры шрифта
System::Call `*$R0(i.s,i.s,i.s,i.s,i.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&t32.s)`
#Согласно информации, для создания шрифта
System::Call `gdi32::CreateFont(is,is,is,is,is,is,is,is,is,is,is,is,is,ts)i.s`
#Установка области, предварительного просмотра шрифта
System::Call `user32::SendMessage(ir0,i${WM_SETFONT},is,i0)`

#Пользователь выбирает выходные параметры шрифта
System::Call `*$R0(i,i,i.s,i.s,i.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&i1.s,&t32.s)`
#Размер и цвет
System::Call `*$R1(i,i,i,i,i.s,i,i.r4,i,i,i,i,i,&i2,i,i)`
#SetCtlColors Нельзя использовать переменные
#Следующие две строки для установки цвета
System::Call `*(ir4,i0,i${BS_NULL},i0,i${TRANSPARENT},i${CC_TEXT}|${CC_BKB})i.r5`
System::Call `user32::SetWindowLong(ir0,i${GWL_USERDATA},lr5)`
#обновить окно
System::Call `user32::ShowWindow(ir0,i${SW_HIDE})`
System::Call `user32::ShowWindow(ir0,i${SW_SHOW})`

#Размер дисплея, и шрифт информационной структуры
System::Call `*$R0(&l.s)`
System::Call `user32::SendDlgItemMessage(i$HWND,i1203,i${WM_SETTEXT},i0,ts)`

System::Call `user32::SendDlgItemMessage(i$HWND,i1204,i${WM_SETTEXT},i0,ts)`
#Цвет строки форматирования
IntFmt $4 0x%06X $4
System::Call `user32::GetDlgItem(i$HWND,i1205)i.r6`
System::Call `user32::SendMessage(ir6,i${WM_SETTEXT},i0,tr4)`
System::Call `user32::SetWindowLong(ir6,i${GWL_USERDATA},lr5)`
System::Call `user32::ShowWindow(ir6,i${SW_HIDE})`
System::Call `user32::ShowWindow(ir6,i${SW_SHOW})`
System::Call `user32::SendDlgItemMessage(i$HWND,i1206,i${WM_SETTEXT},i0,ts)`
System::Call `user32::SendDlgItemMessage(i$HWND,i1207,i${WM_SETTEXT},i0,ts)`
System::Call `user32::SendDlgItemMessage(i$HWND,i1208,i${WM_SETTEXT},i0,ts)`

System::Call `user32::SendDlgItemMessage(i$HWND,i1209,i${WM_SETTEXT},i0,ts)`
System::Call `user32::SendDlgItemMessage(i$HWND,i1210,i${WM_SETTEXT},i0,ts)`
System::Call `user32::SendDlgItemMessage(i$HWND,i1211,i${WM_SETTEXT},i0,ts)`
System::Call `user32::SendDlgItemMessage(i$HWND,i1212,i${WM_SETTEXT},i0,ts)`

System::Call `user32::SendDlgItemMessage(i$HWND,i1213,i${WM_SETTEXT},i0,ts)`
System::Call `user32::SendDlgItemMessage(i$HWND,i1214,i${WM_SETTEXT},i0,ts)`
System::Call `user32::SendDlgItemMessage(i$HWND,i1215,i${WM_SETTEXT},i0,ts)`
System::Call `user32::SendDlgItemMessage(i$HWND,i1216,i${WM_SETTEXT},i0,ts)`

System::Call `user32::SendDlgItemMessage(i$HWND,i1217,i${WM_SETTEXT},i0,ts)`
System::Free $R1
end:
FunctionEnd

Function SetSampleText
System::Call `user32::SendDlgItemMessage(i$HWND,i1232,i${WM_GETTEXT},i${NSIS_MAX_STRLEN},t.s)`
System::Call `user32::SendMessage(ir0,i${WM_SETTEXT},i0,ts)`
System::Call `user32::ShowWindow(ir0,i${SW_HIDE})`
System::Call `user32::ShowWindow(ir0,i${SW_SHOW})`
FunctionEnd

Function .onGUIEnd
System::Free $R0
System::Free $5
FunctionEnd

Section
SectionEnd

PS после компиляции будет немного ругани, не влияющей на работоспособность. И похоже опять - из nsWindows.nsh...

MKN
02-10-2013, 16:40
Информация об установленных жестких дисках.

Может быть получена при помощи спец. DLL и следующего кода :

!AddPluginDir .
!include "LogicLib.nsh"
Caption "HardDisk Info"
OutFile "GetHardDiskInfo.exe"

Section
StrCpy $0 0
${Do}
HddInfo::GetModelNumber $0
Pop $1
${IfThen} $1 == "" ${|} ${ExitDo} ${|}
HddInfo::GetSerialNumber $0
Pop $2
HddInfo::GetBufferSize $0
Pop $3
HddInfo::GetDiskSize $0
Pop $4
Call GetDiskPos
MessageBox MB_ICONINFORMATION|MB_OK "Жесткий диск (HDD $0) модель: $1 $\r$\n\
Cерийный номер : $2 $\r$\n\
Размер кэш-памяти : $3 $\r$\n\
Объём жесткого диска: $4 $\r$\n\
Установлен (подключен) как : $R0"
IntOp $0 $0 + 1
${Loop}
SectionEnd

Function GetDiskPos
Intop $R0 $0 / 2
${Select} $R0
${Case} "0"
StrCpy $R1 "Primary"
${Case} "1"
StrCpy $R1 "Secondary"
${Case} "2"
StrCpy $R1 "Tertiary"
${Case} "3"
StrCpy $R1 "Quaternary"
${EndSelect}

Intop $R0 $0 % 2
${Select} $R0
${Case} "0"
StrCpy $R0 "Master"
${Case} "1"
StrCpy $R0 "Slave"
${EndSelect}
StrCpy $R0 "$R1 $R0"
FunctionEnd

alexfinik
02-10-2013, 19:29
Не могу понять как использовать массивы nsArray или NSISArray:(((
Как это сделать? Может кто-то привести программку, которая сначала задает массив z[0]=a, z[1]=b, z[2]=c, z[3]=d, z[4]=e с последующей выдачей


${ForEach} $i 0 4 + 1
MessageBox MB_OK $z[$i]
${Next}


Что-то типа того... Мануалов как-то негусто... По примерам - не все работают. Может потому что у меня unicode-версия...

kotkovets
03-10-2013, 11:17
Не могу понять как использовать
массивы nsArray или NSISArray
!include MUI2.nsh
!include NSISArray.nsh

Name 'Write'
OutFile 'NSISArrayExample.exe'

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

${Array} "Ar_1" 1 4 ;объявляем массив "Ar_1"
${ArrayFunc} Write ;объявляем функции массива "Ar_1"
${ArrayFunc} Read ;

Section

${Ar_1->Init} ;иницилизируем массив "Ar_1"

; запол "Ar_1"
${Ar_1->Write} 0 "Что-то"
${Ar_1->Write} 1 "типа"
${Ar_1->Write} 2 "того"
${Ar_1->Write} 3 "массив"
${Ar_1->Write} 4 "работает"

; читаем массив "Ar_1"
${ForEach} $R1 0 4 + 1
${Ar_1->Read} $R0 $R1
MessageBox MB_OK "Ar_1[$R1]=$R0" IDOK
${Next}

${Ar_1->Delete} ;удаляем массив "Ar_1"

SectionEnd

alexfinik
03-10-2013, 19:58
Еще вопрос. Не смог понять и найти как задать размер окна в nsDialogs. Например где тут задавать? В мануале не нашел. Там только описание всяких операторов. Спасибо!

Function nsDialogsPage1

nsDialogs::Create 1018

Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}

${NSD_CreateLabel} 0 0 100% 12u "Label1"
Pop $Label1
${NSD_CreateText} 0 13u 100% 12u "X"
Pop $X


nsDialogs::Show

FunctionEnd

kotkovets
03-10-2013, 22:37
Еще вопрос. Не смог понять и найти как задать размер окна в nsDialogs. Например где тут задавать? В мануале не нашел »
а он, диалог, по умолчанию задается в ресурсах установщика

alexfinik
04-10-2013, 10:39
kotkovets, Не понял слово "ресурсы" в этом контексте, но правильно ли я понимаю, что невозможно в ходе программы размер окна поменять? Что же делать, если мне нужно создать окно то с 1, то с 10 полями, в зависимости от того, что выберет пользователь?

MKN
04-10-2013, 11:54
что невозможно в ходе программы размер окна поменять? »
Не совсем ясно, что означает "в ходе программы" ? А вообще, самое простое для изменения размера окон - использовать плагин nsResize. Или, если не лень, размер окон можно изменять с помощью System плагина, вызывая соответствующие API.

alexfinik
04-10-2013, 13:06
Не совсем ясно, что означает "в ходе программы" ? А вообще, самое простое для изменения размера окон - использовать плагин nsResize. Или, если не лень, размер окон можно изменять с помощью System плагина, вызывая соответствующие API. »

MKN, типа если в первом окне задаю цифру 10 для некоторой переменной, в следующем окне появляется 10 строчек. Разумеется для этого окно должно быть увеличено в размерах.
По-видимому nsResize мне подойдет, спасибо!

MKN
04-10-2013, 16:24
Подскажите пожалуйста : как запускать NSIS инсталлятор в режиме "always on top - всегда поверх всех окон" ? Хотя бы одну страницу (но желательно сохранять этот режим для каждой последующей)
Пробовал так :

OutFile "TOP.exe"
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002
!define HWND_TOPMOST -1

Function .onInit

System::Call "user32::SetWindowPos(i $HWNDPARENT, i ${HWND_TOPMOST}, i0, i0, i0, i0, i ${SWP_NOSIZE}|${SWP_NOMOVE})"

; или :

; System::Call "user32::SetWindowPos(i $HWNDPARENT, i -1,i0, i0, i0, i0, i 3)"

FunctionEnd

Section
SectionEnd

не работает...

И как бы сделать кнопочку-переключатель режима "always on top" - где нибудь в верхнем правом углу окна ?

kotkovets
04-10-2013, 20:52
Подскажите пожалуйста : как запускать NSIS инсталлятор в режиме "always on top - всегда поверх всех окон" ? Хотя бы одну страницу (но желательно сохранять этот режим для каждой последующей)
Пробовал так : »
MKN твоя ошибка в том, что ты рано применяешь команду, в функции иницилизации приложения - нет окна, $HWNDPARENT = 0
Нужно в функции иницилизации окна, когда окно есть, но его не видно.. :)
!include "MUI2.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT GUIInit
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "TOP.exe"

Function GUIInit
System::Call "user32::SetWindowPos(i$HWNDPARENT,i-1,i,i,i,i,i3)"
FunctionEnd

Section
SectionEnd

Limonica
10-10-2013, 18:15
1. Как завершить процесс, с помощью плагина System?

2. Как освободить dll-библиотеку от блокирующих дискрипторов?

kotkovets
10-10-2013, 19:01
Limonica,
1. через справочник на русском..
2. через reboot

Limonica
10-10-2013, 19:09
1. через справочник на русском..
2. через reboot »
2. Средствами Windows это выглядит так taskkill /f /fi "modules eq name.dll", нужна альтернатива для NSIS, чтоб не зависеть от наличия taskkill, есть варианты?

kotkovets
10-10-2013, 19:35
Средствами Windows это выглядит так taskkill /f /fi "modules eq name.dll", нужна альтернатива для NSIS, чтоб не зависеть от наличия taskkill, есть варианты? »
я же вам сказал, откройте справочник по NSIS на русском - там ответ...

Limonica
10-10-2013, 20:00
kotkovets, можете подправить WinVer2.nsh что правильно определяло редакцию на Windows 7, так удобно пользоваться...

kotkovets
10-10-2013, 20:34
можете подправить WinVer2.nsh что правильно определяло редакцию на Windows 7 »
есть такое дело... скорее на сл. неделе выложу - пока поправляю..

vahe-91
10-10-2013, 21:47
kotkovets, заодно и ${WinName} для Windows 8/8.1 поправьте. А ${WinVersion} и в 8 и в 8.1 возвращает 6.2, но в 8.1 должно было быть 6.3




© OSzone.net 2001-2012