Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Почему вы написали, что надо переименовать? »
Потому, что у меня с родными именами ни в какую не работает... Причину так и не установил. Для тех, у кого возникнет такая же ситуация, на всяк случай и написАл.
пишете что в сети их много »
Ну да, только в китайской сети... :) Встречал паки - до сотни стилей. Только не скачать.
ну почему ${WinVersion} (плагин WinVer2) в Windows 8.1 в одном скрипте возвращает 6.2, в другом 6.1 ? :sorry:
kotkovets
20-09-2013, 22:34
ну почему ${WinVersion} (плагин WinVer2) в Windows 8.1 в одном скрипте возвращает 6.2, в другом 6.1 ? »
потому что, Windows 8.1 финальный релиз в октябре.. http://hi-tech.mail.ru/news/misc/windows-8-1-launch.html
до финала может любые цифры выдавать... потому что не финал..
потому что, Windows 8.1 финальный релиз в октябре.. http://hi-tech.mail.ru/news/misc/win...-1-launch.html
до финала может любые цифры выдавать... потому что не финал.. »
финал, это точно :)
Оказалось, что он запускает файл в режиме совместимости Win7 :dont-know странно, я эту галку точно не ставил.
Таймер обратного отсчёта на кнопке MessageBox_а
Как то эту задачу уже решали с помощью специальной DLL, что не удобно и лишено гибкости управления...
Но есть и другой способ, с помощью nsWindows плагина ( http://sourceforge.net/p/ifififi/code/HEAD/tree/ ) :
!include "nsWindows.nsh"
;!include "LogicLib.nsh"
!define TimerMsgTitle "Заголовок сообщения"
Name "TimerMsgBox Example"
OutFile "TimerMsgBox.exe"
Var WINDOW
Var Time
!macro MessageBox out text title flags
System::Call "user32::MessageBoxTimeout(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}, i 0) i.s"
Pop ${out}
!macroend
Section
StrCpy $Time 7
${NSW_CreateWindow} $WINDOW "Timer" 1018
${NSW_CreateTimer} OnTimer 1000
!insertmacro MessageBox $0 "Какое то действие через :" "${TimerMsgTitle}" 0x40|0x1
;MessageBox MB_OK "Return Code: $0"
${If} $0 != 1
MessageBox MB_OK " Действие отменяется ! Выход."
Quit
${EndIf}
MessageBox MB_OK " Начинаем какое то действие"
SectionEnd
Function OnTimer
${If} $Time == 0
FindWindow $0 "#32770" "${TimerMsgTitle}"
GetDlgItem $1 $0 1
SendMessage $1 ${BM_CLICK} 0 0
${NSW_KillTimer} OnTimer
${Else}
IntOp $Time $Time - 1
FindWindow $0 "#32770" "${TimerMsgTitle}"
GetDlgItem $2 $0 1
SendMessage $2 ${WM_SETTEXT} 0 "STR: OK $Time sec"
;GetDlgItem $3 $0 65535
;SendMessage $3 ${WM_SETTEXT} 0 "STR:Осталось: $Time sec"
${EndIf}
FunctionEnd
Всё работает как надо, но есть пара не понятных моментов - во-первых после компиляции получаем сообщение :
!warning: Note: nsWindows.dll must be put in NSIS's Plugins Directory! (macro:_NSW_CreateWindow:17)
Хотя nsWindows.dll находится там где и положено !
во-вторых, зачем то создаётся файл в \NSIS\Plugins\nsWindows.tmp\nsWindows$insWindows.dll
и потом не удаляется...
Всё это дело исходит из nsWindows.nsh. Я пробовал три разных вариации nsWindows.nsh, но со всеми эффект одинаков.
(редактировать nsWindows.nsh я не решился...)
Что бы это значило и как это можно устранить ?
Хотел, именно , средствами NSIS, если возможно... Было бы изящно »
Ответили на Winamp_e (как определить размер памяти, занимаемой каким либо процессом ):
Не знаю уж насколько это изящно и универсально... Мне не всё в коде понятно....
OutFile "GetProcessMemoryInfo.exe"
Var /GLOBAL pid
; Pid используем необходимого процесса )
Section
System::Call KERNEL32::GetCurrentProcessId()i.s
Pop $pid
!include LogicLib.nsh
!define PROCESS_VM_READ 0x0010
!define PROCESS_QUERY_INFORMATION 0x0400
!define PROCESS_QUERY_LIMITED_INFORMATION 0x1000
System::Call 'KERNEL32::OpenProcess(i${PROCESS_VM_READ}|${PROCESS_QUERY_LIMITED_INFORMATION},i0,i$pid)i.r0'
${If} $0 = 0
System::Call 'KERNEL32::OpenProcess(i${PROCESS_VM_READ}|${PROCESS_QUERY_INFORMATION},i0,i$pid)i.r0'
${EndIf}
${If} $0 = 0
DetailPrint "Unable to open process $pid!"
Goto done_noprocess
${EndIf}
!define CB_PMC32 40
!define CB_PMCE32 44
System::Call '*(i,i,i,i,i,i,i,i,i,i,i0)i.r1' ; Probably only going to work for 32 bit processes * Наверное, будет работать только для 32 бит процессов
System::Call 'PSAPI::GetProcessMemoryInfo(ir0,ir1,i${CB_PMCE32})i.r2'
${If} $2 = 0
System::Call 'PSAPI::GetProcessMemoryInfo(ir0,ir1,i${CB_PMC32})i.r2'
${EndIf}
${If} $2 = 0
DetailPrint "GetProcessMemoryInfo failed"
${Else}
System::Call '*$1(i.r2,i,i,i.r3,i,i,i,i,i.r4,i,i.r5)'
${IfThen} $5 <> 0 ${|} StrCpy $4 $5 ${|} ; MSDN claims PagefileUsage is always 0 on Win7+ (Does not seem to be true but lets play it safe)
DetailPrint "cbStruct=$2 WorkingSet=$3 PrivateUsage=$4"
${EndIf}
System::Free $1
System::Call 'KERNEL32::CloseHandle(ir0)'
done_noprocess:
SectionEnd
MKN, Спасибо, что не забыли мою просьбу! Да, это решение трудно назвать изящным :), думал будет не больше двух строк...
думал будет не больше двух строк... »
Так оно и будет. Если добавить это код (наверняка модернизировав) в ProcessFunc.nsh... Может kotkovets, так и сделает ?
Продолжая вопрос скинизации, нашел у китайцев еще 30 скинов *.she и просмотрщик стилей SHEViewer. Собрал в кучу ранее выложенные здесь скины и русскую версию SHEditor: СКАЧАТЬ (http://rghost.ru/48948010).
Если у вас будут новые (другие) файлы стилей, просто добавьте их папку "Skins" и SHEViewer подхватит их автоматически.
Скриншот SHEViewer:
http://savepic.org/4519935m.png (http://savepic.org/4519935.htm)
MKN, если не трудно, дай пожалуйста ссылки на ресурсы с наборами стилей, может мне удастся пополнить нашу коллекцию. По поводу переименования файла стиля в skinh.she ты был прав, я ошибся, прошу прощения. Это имя стиля зашито в библиотеке DLL и используется по умолчанию. Если надо использовать другой стиль, то нужно переименовать файл, или использовать функцию SkinH_AttachEx для загрузки стиля с другим именем.
ссылки на ресурсы с наборами стилей »
Навскидку :
http://download.csdn.net/detail/ynthynkdee/4902323
http://download.csdn.net/detail/xiaoy_2012/5123375
http://download.csdn.net/detail/simadi/5422313
Только, раз уж есть SHEditor, то дело за малым - за творчеством...
ps Похоже, что кроме SkinH_AttachEx, есть и другие инструкции : http://www.esoyu.com/soft/develop/26754.html
Vincent7
27-09-2013, 02:09
Здравствуйте. Такой вопрос- можно ли сделать проверку символов в пути устанавливаемой программы? Например проверить чтобы в нем небыло пробелов, если есть- abort. Такое возможно?
kotkovets
27-09-2013, 09:14
можно ли сделать проверку символов в пути устанавливаемой программы? Например проверить чтобы в нем небыло пробелов »
зачем это нужно... для чего.. какие цели?
Limonica
27-09-2013, 12:31
Можно пример, как скачать файл силами плагина System.dll
Vincent7
27-09-2013, 12:44
kotkovets, ну например программе нужно для работы чтобы в пути не было русских букв.
как скачать файл »
С помощью плагинов Inetc plug-in , InetLoad и др.
Limonica
27-09-2013, 16:45
С помощью плагинов Inetc plug-in , InetLoad и др. »
а с помошью System plug-in невозможно?
а с помошью System plug-in невозможно? »
Вполне... Только это для любителей изобретать велосипед и создавать себе трудности... :)
Вызывай нужные API и вперёд... URLDownloadToFile() и т.д.
https://dev.stel.com/api/files
http://www.realcoding.net/articles/ispolzovanie-internet-funktsii-win32-api.html
http://www.rsdn.ru/article/inet/inetapi.xml
kotkovets
27-09-2013, 20:41
например программе нужно для работы чтобы в пути не было русских букв. »
1) Так зачем то, давать возможность давать изменять путь установки, отпадает куча вопросов...
задать к примеру жесткую установку к примеру:
installdir "$PROGRAMFILES\PROGRAM_SOFT"
---
2) Можно фильтровать путь установки, таким методом фильтрации и сравнения длины строк:
!include "WordFunc.nsh"
!include "StrFunc.nsh"
!include "Logiclib.nsh"
installdir "$PROGRAMFILES\prof\опа"
outfile rus_test.exe
Section
StrLen $R0 $INSTDIR
${StrFilter} "$INSTDIR" "12eng" `" ~ @ # № $$ % ; : ^ & ? * ( ) - _ + = < > / \ [ ] } { . , ` "" $R1
StrLen $R1 $R1
${If} $R0 > $R1
MessageBox MB_OK "В строке: [ $INSTDIR ]$\nесть русские символы" IDOK
Abort
${EndIf}
MessageBox MB_OK "OK!" IDOK
SectionEnd
Ещё раз про Skin_ы.
На skinse.com есть такой плагин - SkinSE NSIS Plugin. Позволяет "одевать" инсталлятор с помощью SkinSE_NSIS.dll, SkinSE.dll и SkinSE_QQ2009.zip (архив с графическими bmp элементами)
!addplugindir .
OutFile "SkinSE_NSIS.exe"
!include "MUI2.nsh"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
InstallDir $TEMP
/*
InstallSkinSE
SkinSE_EnableHookSkin
SkinSE_EnableTitleMenuBar
SkinSE_Button_SetBackBitmap
SkinSE_InitSkinSE_LoadSkinResourceFromFolder
SkinSE_LoadSkinResourceFromRes
SkinSE_LoadSkinResourceFromZIP
SkinSE_RefreshAllControls
SkinSE_RemoveLayoutPos
SkinSE_SetBitmapHSB
SkinSE_SetColorHSB
SkinSE_SetHSB
SkinSE_SetLayoutMainFrame
SkinSE_SetLayoutWindowPos
SkinSE_SetScrollBarSkin
SkinSE_SubclassWindow
SkinSE_SubclassWindowEx
SkinSE_UpdateChildControlSkin
UnstallSkinSE
*/
Function .onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File SkinSE.dll
File SkinSE_QQ2009.zip
System::Call SkinSE::SkinSE_LoadSkinResourceFromZIP(t"$PLUGINSDIR\SkinSE_QQ2009.zip",t)
!ifdef SKINSE_NOHOOK
System::Call SkinSE::SkinSE_Init(i$HWNDPARENT,i1)
!else
System::Call SkinSE::SkinSE_EnableHookSkin(i1)
System::Call SkinSE::SkinSE_RefreshAllControls()
!endif
System::Call SkinSE::SkinSE_Menu_EnableSkin(i1)
FunctionEnd
Function .onGUIEnd
SkinSE::UnstallSkinSE
System::Call Kernel32::GetModuleHandle(t"SkinSE_NSIS.dll")i.s
System::Call Kernel32::FreeLibrary(is)
System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd
; в сопроводительном примере код упрощен... :
/*Function .onInit
InitPluginsDir
File "/oname=$PLUGINSDIR\SkinSE.dll" "SkinSE.dll"
File "/oname=$PLUGINSDIR\SkinSE_QQ2009.zip" "SkinSE_QQ2009.zip"
SkinSE_NSIS::setskinpath /NOUNLOAD "$PLUGINSDIR\SkinSE_QQ2009.zip"
FunctionEnd
Function .onGUIEnd
SkinSE::UnstallSkinSE
SetOutPath $TEMP
FunctionEnd*/
Section
SectionEnd
Скачать SkinSE For NSIS : http://www.skinse.com/Download.htm
Limonica
29-09-2013, 20:45
kotkovets, есть ли обнова WinVer2.nsh c правильным отображением Windows 8 и 8.1 ?
И вопрос по редакциям Windows 7, существуют же не только N редакции но и K и KN как быть с ними?
И как универсально распознать Home Basic независимо от издания (N, K, KN)?
ProcessFunc.nsh недавно выложенная тоже не работает в самой последней версии :(
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC