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

tony1990
09-09-2013, 21:25
Да. Изменение размера окна в ресурсах оказалось самым оптимальным решением. Подправил. Супер!
В связи с этим возникла идейка что наверно можно и стандартную надпись про доступный объём на диске
поместить на страницу компонентов, используя те же ресурсы. Код в ресурсах добавил, но вероятно надо править в исходниках ещё. Вообще реально ли это сделать?

Salmo
10-09-2013, 13:40
Добрый день. Есть ли возможность получить в переменную командную строку запущенного процесса GetCommandLine?

kotkovets
10-09-2013, 15:47
Есть ли возможность получить в переменную командную строку запущенного процесса GetCommandLine »
Есть, для себя, делал такой макрос:
!define CmdProsess "!insertmacro CallCmdProsess"
!macro CallCmdProsess `PID` `OUT`
!ifndef VAR_CMDPROSESS
;объявление структур
!define VAR_STRUCT
!define stPROCESS_PARAMETERS "(i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i.s,i,i,i,i,i,i,i,i,i,i)"
!define stPROCESS_BASIC_INFORMATION "(i,i.s,i,i,i,i)"
!define stPEB "(i,i,i,i,i.s,i,i)"
;;;;;;;;;;;;;
!endif
System::Store S
System::Call "kernel32::OpenProcess(i0x1F0FFF,i0,i${PID})i.R2"
System::Alloc 24
Pop $R0
System::Call "ntdll::NtQueryInformationProcess(iR2, i0, iR0, i24, in)i.R1"
${If} $R1 == 0
System::Alloc 28
Pop $R1
System::Call "*$R0${stPROCESS_BASIC_INFORMATION}" ;PebBaseAddress
System::Free $R0
System::Call "kernel32::ReadProcessMemory(iR2, is, iR1, i28, *in)"
System::Alloc 144
Pop $R0
System::Call "*$R1${stPEB}" ;ProcessParameters
System::Free $R1
System::Call "kernel32::ReadProcessMemory(iR2, is, iR0, i144, *in)"
System::Call "*$R0${stPROCESS_PARAMETERS}" ;CommandLine
System::Free $R0
System::Call "kernel32::ReadProcessMemory(iR2, is, w.s, i536, *in)"
System::Call "kernel32::CloseHandle(iR2)"
${Else}
System::Free $R0
System::Call "kernel32::CloseHandle(iR2)"
Push error
${EndIf}
System::Store L
Pop `${OUT}`
!macroend
использование макроса:
${CmdProsess} "пид процесса" "$var"
Как найти пид запущенного процесса читаем в справочнике: » Работа с процессами с помощью NSIS..
$var - переменная, где находится командная строка запущенного процесса

MKN
10-09-2013, 17:18
К слову о процессах. Можно извлечь в переменную, командную строку (полный путь установщика) для текущего процесса, альтернативно функции из справочника :
System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
MessageBox MB_OK "$R0"
с помощью функции GetCommandLine :

System::Call kernel32::GetCommandLine()t.r0
MessageBox MB_OK "$0"

То же самое, но чуть короче...

kotkovets
10-09-2013, 17:41
с помощью функции GetCommandLine »
и вообще то, для этого есть переменная:
MessageBox MB_OK "$CMDLINE"

Salmo
11-09-2013, 19:00
kotkovets, Добрый день. Позволю себе в третий раз задать тот же вопрос. Видимо, вы не видели предыдущие... Вы, как-то, намеревались написать библиотеку для работы с окнами приложений. Что-нибудь есть подобное? Хотелось бы кликать на объекты формы по координатам и т.д.... И на чужой форме создавать всплывающие подсказки.

kotkovets
11-09-2013, 21:11
kotkovets, Добрый день. Позволю себе в третий раз задать тот же вопрос. Видимо, вы не видели предыдущие... »
Хотелось бы кликать на объекты формы по координатам »
это не просто... здесь строго индивидуально.. нет здесь универсального решения.. чтоб взял, да и все работало на все...
как то так..

MKN
12-09-2013, 12:16
и вообще то, для этого есть переменная:
Код:
MessageBox MB_OK "$CMDLINE" »
Действительно, куда уж проще :) Хотя $CMDLINE я в доке не обнаружил... Есть $EXEPATH
А зачем тогда в справочнике пример с GetModuleFileNameA ? Если для общего развития, то понятно. Тогда и GetCommandLine сгодится.
Хотя получается, что место им в разделе : "А здесь не ищут лёгких путей" :)

И ещё о получении пути запущенного процесса, как альтернатива твоего замечательного ProcessFunc.nsh. Есть ещё хедер некоего Erik Pilsits - Process Functions Header. Делает вроде как то же самое, только с маленьким огрехом, упомянутым неким poofeg в своём блоге :
Но оказалось у него есть одна проблема, он завершает процесс “по доброму” только один раз. Следующие вызовы функции ${CloseProcess} делают ничего. Пришлось его немного исправить, вот исправленный вариант: [download#16]. Проблема была в сравнении $4 == “callback1″, когда при следующем вызове уже callback2 и т.д.
Скачать исправленный вариант не получается и стОит ли оно того, раз уже есть ProcessFunc.nsh ?

По поводу кликанья по объектам... Меня давно интересует функция GetCapture, которая извлекает дескриптор окна , который захватила мышь. А также как регистрировать слик мыши для управления событиями ? Но не знаю как это приспособить в NSIS. Не приведёшь пример ?

kotkovets
12-09-2013, 19:31
"А здесь не ищут лёгких путей" »
это давно ясно...
Делает вроде как то же самое, только с маленьким огрехом »
Но оказалось у него есть одна проблема, он завершает процесс “по доброму” только один раз. Следующие вызовы функции ${CloseProcess} делают ничего. Пришлось его немного исправить, вот исправленный вариант: [download#16]. Проблема была в сравнении $4 == “callback1″, когда при следующем вызове уже callback2 и т.д.
Скачать исправленный вариант не получается и стОит ли оно того, раз уже есть ProcessFunc.nsh ? »
у меня этого нет, потому что в NSIS кривая реализация обратных функций (калбэков)
По поводу кликанья по объектам... Меня давно интересует функция GetCapture, которая извлекает дескриптор окна , который захватила мышь. А также как регистрировать слик мыши для управления событиями ? Но не знаю как это приспособить в NSIS. Не приведёшь пример ? »
не а, по выше причине, может и есть пример - но он кривой будет...

MKN
13-09-2013, 09:06
кривая реализация обратных функций (калбэков) »
Ох уж эти калбаки... Неужели нет никаких способов это исправитть ? А как же тогда автору ButtonEvent плагина удалось реализовать калбак кнопок ? Хотя никакими силами обычным образом этого не сделать... ( имею ввиду, управление кнопкой созданной на стандартной странице, о чём уже как то говорили)

kotkovets
13-09-2013, 12:06
А как же тогда автору ButtonEvent
плагина удалось реализовать
калбак кнопок ?
речь идет о плагине system - посредством, которого осуществляется вызов системных функций апи..

MKN
13-09-2013, 12:19
kotkovets,
Жаль, что system плаг никто до сих пор так и не усовершенствовал...

MKN
13-09-2013, 17:00
Вызов окна "О программе"

Вызывается стандартное окно Windows - "О программе"

!include "MUI2.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Caption "ShellAbout"
OutFile "ShellAbout_test.exe"

var szApp
var szOtherStuff
var hIcon

Function .oninit
;[hWnd] – handler (дискриптор, указатель) на родительское окно У нас - это $HWNDPARENT;
;[szApp] – название программы;
;[szOtherStuff] – дополнительное описание;
;[hIcon] – handler иконка приложения.

StrCpy $szApp "Название программы"
StrCpy $szOtherStuff "Дополнительное описание"
StrCpy $hIcon 0
System::Call `Shell32::ShellAboutA(i,t,t,i) i ($HWNDPARENT,"$szApp","$szOtherStuff",$hIcon) .s`
FunctionEnd

Section
SectionEnd

Вызывать эту функцию лучше отдельной кнопкой (или кликом по ссылке "О программе" ) на странице.

ps Интересует, как лучше разместить это окно, в центре экрана, не зависимо от разрешения ?

MKN
16-09-2013, 10:26
Извлечение иконок из ресурсов файлов.


!include "MUI2.nsh"
Caption Icon
OutFile icon_test.exe
Page custom CreatePage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Function CreatePage
; Функция ExtractIcon извлекает дескриптор значка из указанного исполняемого файла,
; динамически подключаемой библиотеки (DLL) или файла значка.
; Если указанная иконка отсутствует, функция возвращает 0.
; Кол-во иконок, содержащихся в файле, можно узнать, указав в качестве последнего параметра –1.

!insertmacro MUI_HEADER_TEXT "ICO" "Извлечение иконок из ресурсов файлов"
nsDialogs::Create 1018
Pop $0

System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "explorer.exe", i 0) i.R0'
System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "mydocs.dll", i 0) i.R1'
System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 17) i.R2'
System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 32) i.R3'
System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 31) i.R4'
System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 34) i.R5'
System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 71) i.R6'
System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 113) i.R7'
System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 116) i.R8'
System::Call 'shell32::ExtractIcon(i $HWNDPARENT, t "shell32.dll", i 130) i.R9'

${NSD_CreateIcon} 0u 0u 30u 30u "icon1"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R0
${NSD_CreateIcon} 40u 0u 30u 30u "icon2"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R1
${NSD_CreateIcon} 80u 0u 30u 30u "icon3"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R2
${NSD_CreateIcon} 120u 0u 30u 30u "icon4"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R3
${NSD_CreateIcon} 160u 0u 30u 30u "icon5"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R4
${NSD_CreateIcon} 0u 40u 30u 30u "icon6"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R5
${NSD_CreateIcon} 40u 40u 30u 30u "icon7"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R6
${NSD_CreateIcon} 80u 40u 30u 30u "icon8"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R7
${NSD_CreateIcon} 120u 40u 30u 30u "icon9"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R8
${NSD_CreateIcon} 160u 40u 30u 30u "icon10"
Pop $0
SendMessage $0 ${STM_SETIMAGE} ${IMAGE_ICON} $R9

nsDialogs::Show

System::Call 'user32::DestroyIcon(iR0)'
System::Call 'user32::DestroyIcon(iR1)'
System::Call 'user32::DestroyIcon(iR2)'
System::Call 'user32::DestroyIcon(iR3)'
System::Call 'user32::DestroyIcon(iR4)'
System::Call 'user32::DestroyIcon(iR5)'
System::Call 'user32::DestroyIcon(iR6)'
System::Call 'user32::DestroyIcon(iR7)'
System::Call 'user32::DestroyIcon(iR8)'
System::Call 'user32::DestroyIcon(iR9)'
FunctionEnd

Section
SectionEnd

MKN
17-09-2013, 17:28
"Шкурный вопрос" или об оформлении NSIS инсталлятора с помощью Skin_ов

Когда пользователи хотят оформить-украсить аскетичный NSIS инсталлятор, то первым делом вспоминают NSIS SkinCrafter Plugin.
( http://skincrafter.com/products/nsis-skincrafter-plugin )
Вроде бы простой код использования, много дополнительных файлов-скинов (*.skf) в галерее ( http://skincrafter.com/gallery )
Но... Невменяемый размер плагина (6,5 метров !) и ощутимая глазом задержка при перерисовке "ошкуренных" страниц
сразу заставляют задуматься, а нужно ли такое чудо ? (K.A.V. когда то модернизировал SkinCrafter.dll , но она у меня вообще не хочет работать... Родная работает... )

Приходится искать альтернативу. И она конечно есть.

Например, программа ISSkinEx 3.0.0.2 for InnoSetup and NSIS ( http://restools.hanzify.org/ ).
Скины можно изготовить самому и загружать их ( это файлы *.cjstyles ) с помощью ISSkinEx.dll (ISSkinExU.dll)
Самостоятельное изготовление - дело хлопотное, ( хотя можно ограничиться использованием имеющихся в комплекте нескольких стилей-заготовок ) . Общий размер скина с DLL, при этом получается около 1M, что уже преемлемо...

У китайских товарищей большой популярностью пользуется NSIS SkinSharp библиотека ( SkinH.dll ), к которой в сети имеется много пакетов с разнообразными стилями оформления ( файлами *.she ) Размер вмеcте с DLL ~100K . Код подключения :

!include "MUI2.nsh"

!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

Name "SkinH"
OutFile "SkinH.exe"
InstallDir "$TEMP"

Function onGUIInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File "SkinH.dll"
File "skinh.she"
System::Call SkinH::SkinH_Attach()
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
IntOp $0 $0 + 0x0002CA98
System::Call Kernel32::GetCurrentProcess()i.s
System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
System::Call "*$0(&i1 0)"
FunctionEnd

Function .onGUIEnd
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
System::Call Kernel32::FreeLibrary(is)
System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

Section
SectionEnd

Файл стиля должен называться - skinh.she ! Т.е. , т.к. названия файлов-стилей, разннобразные, то их надо переименовывать.

Вот вариант кода с прозрачной страницей и возможностью поместить на странице фоновый рисунок :


!define iTransparentPercent 80
Var dlg
Var Label1
Var iTransparent
Var bTransparent
Var Bitmap
Var BitmapHandle

!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "LogicLib.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
page custom MyPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
OutFile "transparent.exe"

Function .onInit
InitPluginsDir
File /oname=$PLUGINSDIR\Pict.bmp "Pict.bmp"
IntOp $iTransparent ${iTransparentPercent} * 255
IntOp $iTransparent $iTransparent / 100
StrCpy $bTransparent 0
FunctionEnd

Function myGuiInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File SkinH.dll
File skinh.she
System::Call SkinH::SkinH_Attach()

System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
IntOp $0 $0 + 0x0002CA98
System::Call Kernel32::GetCurrentProcess()i.s
System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
System::Call "*$0(&i1 0)"
FunctionEnd

Function MyPage
Call SetWindowAttrib
${If} $bTransparent == 0
${For} $R0 0 $iTransparent
system::call 'user32::SetLayeredWindowAttributes(i $HWNDPARENT, i 0, i R0, i 2) .iR1'
${Next}
${Endif}

nsDialogs::Create 1044
Pop $dlg

${NSD_CreateLabel} 140u 10u 180u 20u " Transparent Window"
Pop $Label1
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1200
CreateFont $2 "tahoma" "18" "660"
SendMessage $0 ${WM_SETFONT} $2 0

${NSD_CreateBitmap} 0 0 100% 100% ""
Pop $Bitmap
StrCpy $0 $PLUGINSDIR\Pict.bmp
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $BitmapHandle
SendMessage $Bitmap ${STM_SETIMAGE} ${IMAGE_BITMAP} $BitmapHandle

nsDialogs::Show
FunctionEnd

Function .onGUIEnd
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
System::Call Kernel32::FreeLibrary(is)
System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

Function SetWindowAttrib
${if} $bTransparent == 0
system::call 'user32::GetWindowLong(i $HWNDPARENT, i ${GWL_EXSTYLE}) .iR0'
IntOp $R0 $R0 + 0x80000}
system::call 'user32::SetWindowLong(i $HWNDPARENT, i ${GWL_EXSTYLE}, i R0) .iR1'
system::call 'user32::SetLayeredWindowAttributes(i $HWNDPARENT, i 0, i 0, i 2) .iR2'
Pop $R2
Pop $R1
Pop $R0
${endif}
FunctionEnd

Section
SectionEnd

MKN
18-09-2013, 11:41
"Шкурный вопрос" или об оформлении NSIS инсталлятора с помощью Skin_ов. Продолжение.

Дополнительные стили для SkinH.dll :
Скачать : http://www.mediafire.com/?q5lk80vd7ivf9ob
Стилей в сети много, но почти все они на китайских ресурсах, откуда скачать их затруднительно (надо регистрироваться, иногда вводить капчу иероглифами и пр.).. :)
Если кому удастся скачать ещё стилей - выложите пожалуйста здесь .

Но пожалуй, самая простая и удобная в применении - это библиотека Skin.dll. Не требует доп файлов-стилей. Тоже от китайских умельцев.
Скачать : http://www.mediafire.com/?1g2idooxhm2713i
В зависимости от выбранных инструкций и параметров вызова DLL, можно получать разнообразные результаты. ( Но не со всеми инструкциями я разобрался... Кто владеет китайским, может меня дополнит и поправит... Оригинал док в архиве ) )

!include "MUI2.nsh"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

OutFile "Skin_test.exe"
InstallDir "$TEMP"

; инструкция вызова wmSkin
; Параметр 1 : выбор скина (Skin ID) - значения : 0...25
; Параметр 2 : установка прозрачности - значения : 0 или 1

; инструкция вызова setSkin - ( установки Color Adjustment )
; Параметр 1 "Цвета", Диапазон значений -180...180 , значение по умолчанию 0.
; Параметр 2 "Насыщенность", Диапазон значений -100...100, значение по умолчанию 0.
; Параметр 3 "Яркость", Диапазон значений -100...100 , значение по умолчанию 0.

; инструкция вызова delSkin - выгружает DLL из памяти

; Другие инструкция вызова : VShin, DVSkin - не совсем ясно , для чего...


Function .onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File "Skin.dll"

system::call 'Skin::wmSkin(i8,i0)'

; если надо ещё разукрасить скин - раскомментируйте следующую команду
;system::call 'Skin::setSkin(i-110,i0,i0)'

FunctionEnd

Section
Sleep 500
SectionEnd

Изменяя значения параметров - выбираете и изменяете внешний вид скина.

Salmo
19-09-2013, 17:31
Добрый день, господа. Можно ли средствами NSIS определить размер памяти, занимаемой другим процессом?

MKN
20-09-2013, 09:44
определить размер памяти, занимаемой другим процессом? »
Может с помощью функции GetProcessMemoryInfo ? Тут был пример кода Pascal/Delphi :
(http://forum.vingrad.ru/forum/s/de09caa3cd90260f2f084c38e109baf5/topic-318633.html )
А как это дело приспособить для NSIS, не знаю... Может kotkovets подскажет ?

Или сделать проще - использовать утилиту CurrProcess ( http://www.nirsoft.net/utils/cprocess.html )
И получив командой, например для процесса TOTALCMD.exe, :
cprocess /pmhtml TOTALCMD.exe c:\temp\TC.html
файл TC.html с информацией - извлечь из этого файла нужное (Mem Usage / Mem Usage Peak ) . А это уже просто строчные операции...

Salmo
20-09-2013, 13:56
MKN, Спасибо... Посторонними утилитами не проблема, хотя-бы через tasklist и дополнительный файл... Хотел, именно , средствами NSIS, если возможно... Было бы изящно :)

Flix
20-09-2013, 17:35
Может кому интересно будет. Редактор стилей SHEditor v0.2 b5 (русская версия) для файлов скинов *.she: скачать (http://rghost.ru/private/48858211/bcbadc05bf48e0c9670c2d48d1523add).

Файл стиля должен называться - skinh.she !
Пробовал указывать в сценарии имя стиля согласно имени файла - работает. Почему вы написали, что надо переименовать?

Но пожалуй, самая простая и удобная в применении - это библиотека Skin.dll. Не требует доп файлов-стилей.
:) Не требует потому, что эти стили уже вшиты в файл Skin.dll. Я все же больше склоняюсь к минимализму и думаю удобней применять один файл стиля и единственную библиотеку. Жаль только что стилей не так и много. Вы пишете что в сети их много, но я пока нашел только те файлы, которые уже имеются в вашей коллекции. Но все равно, большое спасибо, что затронули "шкурный вопрос". Как раз намедни заинтересовался, а тут раз и ответ.




© OSzone.net 2001-2012