Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
tony1990
09-09-2013, 21:25
Да. Изменение размера окна в ресурсах оказалось самым оптимальным решением. Подправил. Супер!
В связи с этим возникла идейка что наверно можно и стандартную надпись про доступный объём на диске
поместить на страницу компонентов, используя те же ресурсы. Код в ресурсах добавил, но вероятно надо править в исходниках ещё. Вообще реально ли это сделать?
Добрый день. Есть ли возможность получить в переменную командную строку запущенного процесса 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 - переменная, где находится командная строка запущенного процесса
К слову о процессах. Можно извлечь в переменную, командную строку (полный путь установщика) для текущего процесса, альтернативно функции из справочника :
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"
kotkovets, Добрый день. Позволю себе в третий раз задать тот же вопрос. Видимо, вы не видели предыдущие... Вы, как-то, намеревались написать библиотеку для работы с окнами приложений. Что-нибудь есть подобное? Хотелось бы кликать на объекты формы по координатам и т.д.... И на чужой форме создавать всплывающие подсказки.
kotkovets
11-09-2013, 21:11
kotkovets, Добрый день. Позволю себе в третий раз задать тот же вопрос. Видимо, вы не видели предыдущие... »
Хотелось бы кликать на объекты формы по координатам »
это не просто... здесь строго индивидуально.. нет здесь универсального решения.. чтоб взял, да и все работало на все...
как то так..
и вообще то, для этого есть переменная:
Код:
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. Не приведёшь пример ? »
не а, по выше причине, может и есть пример - но он кривой будет...
кривая реализация обратных функций (калбэков) »
Ох уж эти калбаки... Неужели нет никаких способов это исправитть ? А как же тогда автору ButtonEvent плагина удалось реализовать калбак кнопок ? Хотя никакими силами обычным образом этого не сделать... ( имею ввиду, управление кнопкой созданной на стандартной странице, о чём уже как то говорили)
kotkovets
13-09-2013, 12:06
А как же тогда автору ButtonEvent
плагина удалось реализовать
калбак кнопок ?
речь идет о плагине system - посредством, которого осуществляется вызов системных функций апи..
kotkovets,
Жаль, что system плаг никто до сих пор так и не усовершенствовал...
Вызов окна "О программе"
Вызывается стандартное окно 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 Интересует, как лучше разместить это окно, в центре экрана, не зависимо от разрешения ?
Извлечение иконок из ресурсов файлов.
!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
"Шкурный вопрос" или об оформлении 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
"Шкурный вопрос" или об оформлении 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
Изменяя значения параметров - выбираете и изменяете внешний вид скина.
Добрый день, господа. Можно ли средствами NSIS определить размер памяти, занимаемой другим процессом?
определить размер памяти, занимаемой другим процессом? »
Может с помощью функции 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 ) . А это уже просто строчные операции...
MKN, Спасибо... Посторонними утилитами не проблема, хотя-бы через tasklist и дополнительный файл... Хотел, именно , средствами NSIS, если возможно... Было бы изящно :)
Может кому интересно будет. Редактор стилей SHEditor v0.2 b5 (русская версия) для файлов скинов *.she: скачать (http://rghost.ru/private/48858211/bcbadc05bf48e0c9670c2d48d1523add).
Файл стиля должен называться - skinh.she !
Пробовал указывать в сценарии имя стиля согласно имени файла - работает. Почему вы написали, что надо переименовать?
Но пожалуй, самая простая и удобная в применении - это библиотека Skin.dll. Не требует доп файлов-стилей.
:) Не требует потому, что эти стили уже вшиты в файл Skin.dll. Я все же больше склоняюсь к минимализму и думаю удобней применять один файл стиля и единственную библиотеку. Жаль только что стилей не так и много. Вы пишете что в сети их много, но я пока нашел только те файлы, которые уже имеются в вашей коллекции. Но все равно, большое спасибо, что затронули "шкурный вопрос". Как раз намедни заинтересовался, а тут раз и ответ.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC