|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
.: NSIS - все вопросы :. часть 2.
|
Ветеран Сообщения: 1216 |
Профиль | Отправить PM | Цитировать
Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения. Описание: Текущая версия: NSIS 3.05 от 15 декабря 2019 года Скачать | Архив сборок версии Первая часть этой темы Скачать первую часть этой темы одним архивом ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов: Справочник по NSIS - создан силами нашего сообщества. Руководство пользователя. Перевод – Поляков А.В, зеркало Документация Утилиты разработчика Расширение функциональности Примеры скриптов на нашем форуме Скрипт NSIS для перепаковки AIMP2+Сборки Тема для Notepad++(пример парсинга XML) Достоинства Ещё немного полезной информации: |
|
------- Отправлено: 12:02, 09-12-2012 |
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата MKN:
Там в двух местах нужно заменять Скрытый текст
; Display BIOS serial number OutFile "bios_sn.exe" !include "LogicLib.nsh" !define CLSCTX_INPROC_SERVER 1 !define CLSID_WbemLocator {4590f811-1d3a-11d0-891f-00aa004b2e24} !define IID_IWbemLocator {dc12a687-737f-11cf-884d-00aa004b2e24} !define RPC_C_AUTHN_LEVEL_DEFAULT 0 !define RPC_C_IMP_LEVEL_IMPERSONATE 3 !define EOAC_NONE 0 !define WBEM_FLAG_FORWARD_ONLY 0x20 !define WBEM_FLAG_RETURN_IMMEDIATELY 0x10 !define WBEM_INFINITE 0xffffffff ; Query BIOS serial number via WMI and return it in $0 Function bios_sn ; Save registers Push $1 Push $2 Push $3 Push $4 Push $5 Push $6 Push $7 ; Initialization of COM is done via OleInitialize in NSIS installer code ; Set general COM security level System::Call "ole32::CoInitializeSecurity( \\ i 0, i -1, i 0, i 0, i ${RPC_C_AUTHN_LEVEL_DEFAULT}, \\ i ${RPC_C_IMP_LEVEL_IMPERSONATE}, i 0, i ${EOAC_NONE}, i 0) i.r1" ${If} $1 != 0 StrCpy $0 "failed to initialize security: $1" Goto bios_sn_end ${EndIf} ; Create IWbemLocator interface System::Call "ole32::CoCreateInstance( \\ g '${CLSID_WbemLocator}', i 0, \\ i ${CLSCTX_INPROC_SERVER}, \\ g '${IID_IWbemLocator}', *i .r2) i.r1" ${If} $1 != 0 StrCpy $0 "failed to create IWebmLocator object: $1" Goto bios_sn_end ${EndIf} ; Call IWbemLocator->ConnectServer System::Call "$2->3(w 'ROOT\CIMV2', i 0, i 0, i 0, i 0, i 0, i 0, *i .r3) i.r1" ${If} $1 != 0 StrCpy $0 "failed to connect: $1" ${Else} ; Call IWbemServices->ExecQuery System::Call "$3->20(w 'WQL', w 'Select Name from Win32_BIOS', \\ ${WBEM_FLAG_FORWARD_ONLY} | ${WBEM_FLAG_RETURN_IMMEDIATELY}, \\ i 0, *i .r4) i.r1" ${If} $1 != 0 StrCpy $0 "failed to query: $1 $3" ${Else} ; Call IEnumWbemClassObject->Next System::Call "$4->4(i ${WBEM_INFINITE}, i 1, *i .r5, *i .r6) i.r1" ${If} $1 != 0 StrCpy $0 "failed to iterate: $1" ${Else} ${If} $6 > 0 ; Variant ; (unsigned short vt, WORD wReserved1, ; WORD wReserved2, WORD wReserved3, BSTR bstrVal) ; Allocate memory for Variant System::Call "*(i 0, i 0, i 0) i.r7" ; Call IWbemClassObject->Get System::Call "$5->4(w 'Name', i 0, i r7, i 0, i 0) i.r1" ${If} $1 < 0 StrCpy $0 "failed to get: $1" ${Else} ; Access bstrVal from Variant System::Call "*$7(i, i, w .r0)" System::Call "ole32::VariantClear(i r7)" ${EndIf} ; Free memory associated with Variant System::Free $7 ${Else} StrCpy $0 "failed: no items ***91;$6***93;" ${EndIf} ; Call IWbemClassObject->Release System::Call "$5->2()" ${EndIf} ; Call IEnumWbemClassObject->Release System::Call "$4->2()" ${EndIf} ; Call IWbemService->Release System::Call "$3->2()" ${EndIf} ; Call IWbemLocator->Release System::Call "$2->2()" bios_sn_end: ; Restore registers Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 FunctionEnd Function .onInit InitPluginsDir Call bios_sn MessageBox MB_OK "BIOS Serial Number=$0" Quit FunctionEnd Section SectionEnd |
|
------- Отправлено: 17:28, 19-08-2015 | #1771 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
|
|
Отправлено: 17:32, 19-08-2015 | #1772 |
Ветеран Сообщения: 1216
|
Профиль | Отправить PM | Цитировать MKN, можно и так )
Скрытый текст
OutFile "bios_sn.exe" !include "LogicLib.nsh" !macro IWbemClassObject->Get NameObject OUT System::Call "*(i,i,i)i.R4" System::Call "$R3->4(w'${NameObject}',i0,iR4,i0,i0)" System::Call "*$R4(i.R6,i,i.R5)" StrCmp $R6 3 0 +2 IntFmt $R5 %u $R5 StrCmp $R6 8 0 +2 !ifdef NSIS_UNICODE IntFmt $R5 %s $R5 !else IntFmt $R5 %S $R5 !endif System::Call "ole32::VariantClear(iR4)" System::Free $R4 StrCpy ${OUT} $R5 !macroend Section System::Call "ole32::CoInitializeEx(i0,i2)" System::Call "ole32::CoCreateInstance(g'{4590f811-1d3a-11d0-891f-00aa004b2e24}',i0,i1,g'{dc12a687-737f-11cf-884d-00aa004b2e24}',*i.R0)i.R7" ${If} $R7 == 0 System::Call "ole32::CoInitializeSecurity(i0,i-1,i0,i0,i2,i3,i0,i0,i0)" System::Call "$R0->3(w'root\CIMV2',i0,i0,i0,i0,i0,i0,*i.R1)i.R7" ${If} $R7 == 0 System::Call "$R1->20(w'WQL', w'SELECT * FROM Win32_BIOS',i48,i0,*i.R2)i.R7" System::Call "$R2->4(i0xffffffff,i1,*i.R3,*i)i.R7" ${If} $R7 == 0 !insertmacro IWbemClassObject->Get "Version" $7 MessageBox MB_OK "Version=$7" !insertmacro IWbemClassObject->Get "Manufacturer" $7 MessageBox MB_OK "Manufacturer=$7" !insertmacro IWbemClassObject->Get "Name" $7 MessageBox MB_OK "Name=$7" !insertmacro IWbemClassObject->Get "SMBIOSBIOSVersion" $7 MessageBox MB_OK "SMBIOSBIOSVersion=$7" System::Call "$R0->2()" System::Call "$R1->2()" System::Call "$R2->2()" System::Call "$R3->2()" ${Else} System::Call "$R0->2()" System::Call "$R1->2()" System::Call "$R2->2()" ${EndIf} ${Else} System::Call "$R0->2()" System::Call "$R1->2()" ${EndIf} ${EndIf} SectionEnd |
------- Отправлено: 17:38, 19-08-2015 | #1773 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Возвращаясь к имитации метро фейса...
При использовании WndProc.dll наблюдается такой не приятный момент. При быстром наведении курсора, то на одно изображение, то на другое - оба изображения могут выделиться (замениться на другое изображение) одновременно... И ещё про курсор-ладошку... При перемещении курсора вне изображений , курсор очень быстро, но глазом заметно, изменяется-мельтешит, превращаясь из стрелки в ладошку и обратно... Как бы преодолеть эти неприятные мелочи ? Код такой (дока к плагину не нашёл, может что не так и делаю... ) : Пример кода
!include MUI2.nsh !include LogicLib.nsh !insertmacro MUI_LANGUAGE Russian OutFile ClickPict_WndProc.exe Var Dialog Var Image Var Image2 Page custom nsDialogsPage Function .onInit InitPluginsDir File /ONAME=$PLUGINSDIR\Vinni.bmp Vinni.bmp File /ONAME=$PLUGINSDIR\Vinni2.bmp Vinni2.bmp FunctionEnd Function nsDialogsPage nsDialogs::Create /NOUNLOAD 1018 Pop $Dialog GetFunctionAddress $0 MainWndSubProc WndProc::onCallback /r=1 $Dialog $0 ${NSd_CreateBitmap} 0 0 100% 100% '' Pop $Image ${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1 GetFunctionAddress $0 ImgeSubProc WndProc::onCallback /r=1 $Image $0 ${NSD_AddStyle} $Image ${SS_NOTIFY} ${NSD_OnClick} $Image Click1 ${NSd_CreateBitmap} 90 0 100% 100% '' Pop $Image2 ${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1 GetFunctionAddress $0 ImgeSubProc2 WndProc::onCallback /r=1 $Image2 $0 ${NSD_AddStyle} $Image2 ${SS_NOTIFY} ${NSD_OnClick} $Image2 Click2 nsDialogs::show FunctionEnd ; Сообщение WM_NCHITTEST отправляется в окно тогда, когда перемещается курсор, или когда кнопка мыши нажимается или отпускается. ; Если мышь не захвачена, сообщение отправляется в окно под курсором. В противном случае, сообщение отправляется в окно, которое захватило мышь. ; Окно получает это сообщение через посредство своей функции WindowProc. Function ImgeSubProc ; навели курсор System::Call USER32::LoadCursor(i,i32649)i.s System::Call USER32::SetCursor(is) ${If} $2 = ${WM_NCHITTEST} ${NSD_SetImage} $Image '$PLUGINSDIR\Vinni2.bmp' $1 ${EndIf} FunctionEnd Function ImgeSubProc2 System::Call USER32::LoadCursor(i,i32649)i.s System::Call USER32::SetCursor(is) ${If} $2 = ${WM_NCHITTEST} ${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni2.bmp' $1 ${EndIf} FunctionEnd Function MainWndSubProc ${If} $2 = ${WM_NCHITTEST} ${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1 ${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1 ${EndIf} FunctionEnd Function Click1 MessageBox MB_OK "Click1" FunctionEnd Function Click2 MessageBox MB_OK "Click2" FunctionEnd Section SectionEnd |
Последний раз редактировалось MKN, 27-05-2020 в 16:17. Отправлено: 18:17, 19-08-2015 | #1774 |
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Скрытый текст
!addplugindir "." !include MUI2.nsh !include LogicLib.nsh !insertmacro MUI_LANGUAGE Russian OutFile ClickPict_WndProc.exe Var Dialog Var Image Var Image2 var SetImage1 var SetImage2 Page custom nsDialogsPage Function .onInit InitPluginsDir File /ONAME=$PLUGINSDIR\Vinni.bmp Vinni.bmp File /ONAME=$PLUGINSDIR\Vinni2.bmp Vinni2.bmp FunctionEnd Function nsDialogsPage nsDialogs::Create /NOUNLOAD 1018 Pop $Dialog GetFunctionAddress $0 MainWndSubProc WndProc::onCallback /r=1 $Dialog $0 ${NSd_CreateBitmap} 0 0 100% 100% '' Pop $Image ${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1 GetFunctionAddress $0 ImgeSubProc WndProc::onCallback /r=1 $Image $0 ${NSD_AddStyle} $Image ${SS_NOTIFY} ${NSD_OnClick} $Image Click1 ${NSd_CreateBitmap} 90 0 100% 100% '' Pop $Image2 ${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1 GetFunctionAddress $0 ImgeSubProc2 WndProc::onCallback /r=1 $Image2 $0 ${NSD_AddStyle} $Image2 ${SS_NOTIFY} ${NSD_OnClick} $Image2 Click2 nsDialogs::show FunctionEnd ; Сообщение WM_NCHITTEST отправляется в окно тогда, когда перемещается курсор, или когда кнопка мыши нажимается или отпускается. ; Если мышь не захвачена, сообщение отправляется в окно под курсором. В противном случае, сообщение отправляется в окно, которое захватило мышь. ; Окно получает это сообщение через посредство своей функции WindowProc. Function ImgeSubProc ; навели курсор ${If} $2 = ${WM_MOUSEMOVE} System::Call USER32::LoadCursor(i,i32649)i.s System::Call USER32::SetCursor(is) ${NSD_SetImage} $Image '$PLUGINSDIR\Vinni2.bmp' $1 StrCpy $SetImage1 1 ${EndIf} FunctionEnd Function ImgeSubProc2 ${If} $2 = ${WM_MOUSEMOVE} System::Call USER32::LoadCursor(i,i32649)i.s System::Call USER32::SetCursor(is) ${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni2.bmp' $1 StrCpy $SetImage2 1 ${EndIf} FunctionEnd Function MainWndSubProc ${If} $2 = ${WM_MOUSEMOVE} ${If} $SetImage1 = 1 ${NSD_SetImage} $Image '$PLUGINSDIR\Vinni.bmp' $1 StrCpy $SetImage1 0 ${EndIf} ${If} $SetImage2 = 1 ${NSD_SetImage} $Image2 '$PLUGINSDIR\Vinni.bmp' $1 StrCpy $SetImage2 0 ${EndIf} ${EndIf} FunctionEnd Function Click1 MessageBox MB_OK "Click1" FunctionEnd Function Click2 MessageBox MB_OK "Click2" FunctionEnd Section SectionEnd Цитата MKN:
Цитата MKN:
В код добавил 2 переменные $SetImage1 и $SetImage2, которые используются для того, чтобы постоянно не присваивать изображения элементам (происходит быстрое мерцание из-за постоянного перемещения мыши и присваивания изображений) в функции MainWndSubProc, возможно, можно обойтись без переменных и как-то поиграться с WM_SETREDRAW - оставлю это тебе p.s. Насчет своих изображений кнопкам, есть же плагин SkinnedButton plug-in, если у тебя будут кнопки одного типа - думаю, лучше этим плагом воспользоваться Кстати, вот можешь скачать архивчик с GitHub, там примеры своего интерфейса с парой интересных плюшек + свои мессаджбоксы со своим стилем, я сам в этом не разбирался, посмотрел мельком гугля инфу по твоему плагу WndProc |
||
------- Отправлено: 15:51, 20-08-2015 | #1775 |
Пользователь Сообщения: 110
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Из справочника по NSIS:
|
|
Отправлено: 21:59, 20-08-2015 | #1776 |
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Kopejkin:
В начале кода не забыли добавить? |
|
------- Отправлено: 22:34, 20-08-2015 | #1777 |
Пользователь Сообщения: 110
|
Профиль | Сайт | Отправить PM | Цитировать Цитата K.A.V.:
В Справочнике по NSIS об этом ни гу-гу. |
|
Отправлено: 09:24, 21-08-2015 | #1778 |
Пользователь Сообщения: 83
|
Профиль | Отправить PM | Цитировать Ребята, привет.
У меня вопрос по плагину md5 Как заставить его выполнить такую задачу: нужно чтобы в проверке на оригинальность файла участвовало две хэш-суммы, а не одна. Ну то есть предположим первая хеш-сумма проверяемого файла не совпадает, тогда идёт проверка на вторую хеш-сумму. Если и она не совпадает - прерывание установки и сообщение, мол версия файла неправильная. Надеюсь поможете... А то очень понадобилось реализовать такой вариант. Дело в том что в разных версиях моей программы один и тот же файл имеет разные размеры. Вот и нужно чтобы последнее обновление можно было установить на все предыдущие версии программы. |
Отправлено: 22:51, 23-08-2015 | #1779 |
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Kopejkin:
Цитата Serg866:
|
||
------- Отправлено: 00:03, 24-08-2015 | #1780 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 | dimadr | Наборы обновлений для Windows XP/2003/Windows 7 | 267 | 14-02-2020 08:25 | |
[архив].: NSIS - все вопросы :. | kotkovets | Автоматическая установка приложений | 3387 | 09-12-2012 11:56 | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 | jameszero | Наборы обновлений для Windows XP/2003/Windows 7 | 1491 | 22-07-2011 22:42 | |
Выбор|модернизация процессора .:[все вопросы]:. Часть I | Myxa | Выбор отдельных компонентов компьютера и конфигурации в целом | 1845 | 01-01-2011 19:18 | |
Вопросы по создателю инсталляций NSIS | MaxDELETE | Программное обеспечение Windows | 14 | 04-07-2007 10:01 |
|