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

Dodakaedr
19-08-2015, 15:30
kotkovets, так ключа не существует, перемещать нечего и создается пустой ключ.

kotkovets
19-08-2015, 15:46
так ключа не существует, перемещать нечего и создается пустой ключ. »
!include "RegistryFunc.nsh"
outfile 123.exe
Section
${MoveKey} "${HKLM}\Software\bla_bla" "${HKLM}\Software\7777"
IfErrors 0 +2
MessageBox MB_OK "Ошибка, ключа `bla_bla` нет"
SectionEnd
проверил ниче не создается, так как нет ключа. Создаться ключ 7777 - если ключ bla_bla есть или он пустой.
P.S
ан нет создается ключ 7777, хотя не критично, но подправлю

Dodakaedr
19-08-2015, 15:53
проверил ниче не создается, так как нет ключа. »
Интересно, у меня создается, ваш пример тоже создал ключ 7777, хоч и было сообщение об отсутствии ключа.

MKN
19-08-2015, 16:13
Есть такой известный код определения BIOS serial number с помощью WMI :


; 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 SerialNumber 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 'SerialNumber', 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


Но он почему то не работает в Win7 и выше... Как это исправить ? И будет ли он работать с другими WMI параметрами, т.е. определять не только BIOS Serial Number ?

kotkovets
19-08-2015, 16:48
BIOS serial number с помощью WMI »
в 10 не работает серийник, в скрипте vbs
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colBIOS = objWMIService.ExecQuery ("Select * from Win32_BIOS")

For each objBIOS in colBIOS
Wscript.Echo "Build Number: " & objBIOS.BuildNumber
Wscript.Echo "Current Language: " & objBIOS.CurrentLanguage
Wscript.Echo "Installable Languages: " & objBIOS.InstallableLanguages
Wscript.Echo "Manufacturer: " & objBIOS.Manufacturer
Wscript.Echo "Name: " & objBIOS.Name
Wscript.Echo "Primary BIOS: " & objBIOS.PrimaryBIOS
Wscript.Echo "Release Date: " & objBIOS.ReleaseDate
Wscript.Echo "Serial Number: " & objBIOS.SerialNumber
Wscript.Echo "SMBIOS Version: " & objBIOS.SMBIOSBIOSVersion
Wscript.Echo "SMBIOS Major Version: " & objBIOS.SMBIOSMajorVersion
Wscript.Echo "SMBIOS Minor Version: " & objBIOS.SMBIOSMinorVersion
Wscript.Echo "SMBIOS Present: " & objBIOS.SMBIOSPresent
Wscript.Echo "Status: " & objBIOS.Status
Wscript.Echo "Version: " & objBIOS.Version
Next
очевидно мелкгомякие подрезали что то.. NSIS не виноват

MKN
19-08-2015, 16:57
в 10 не работает серийник »
Ладно серийник... А почему тогда не работают прочие WMI определения в том коде ? Например, для определения модели материнки - изменяю в коде "биосные парметры" на
CIMV2 Win32_BaseBoard Product - всё равно не работает...

kotkovets
19-08-2015, 17:05
А почему тогда не работают прочие WMI определения в том коде ? »
потому что, возвращаемое значения разными бывают (тип строка, число, булево значение и т.д)
поэтому скрипт нужно дотачивать до нужных типов (определить точно, какой тип переменных тебе надо возвратить) т.е какие тебе нужны в итоге.
Скрипт заточен под серийник биоса, и тип возвращаемой переменной Variant

System::Call "$3->20(w 'WQL', w 'Select SerialNumber from Win32_BIOS', \\
${WBEM_FLAG_FORWARD_ONLY} | ${WBEM_FLAG_RETURN_IMMEDIATELY}, \\
i 0, *i .r4) i.r1"
--
--
${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 'SerialNumber', 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}
переделывать скрипт не имеет смысла.

MKN
19-08-2015, 17:07
переделывать скрипт не имеет смысла. »
А как альтернативу wmic ? Разве такой код не работал бы быстрее ? Если нет, то наверное действительно, смысла нет, будем использовать тормозной wmic...

K.A.V.
19-08-2015, 17:10
Но он почему то не работает в Win7 и выше.. »
Работает, просто не у всех прописан этот самый серийный номер и от системы не зависит, на виртуалке VirtualBox будет возвращаться значение 0 и разницы нет, NSIS установщик получает инфу или приложение на C++ (писал своё приложение по получению инфы о железе, материнке, диски, проц, BIOS, видюшка)

И будет ли он работать с другими WMI параметрами, т.е. определять не только BIOS Serial Number ? »
Будет 100%, если тип переменной такой же, как у параметра SerialNumber (string), твой пример заточен именно под получение значений строковых параметров
Подставь, например, Manufacturer или Name за место SerialNumber и получишь значения производителя и версии BIOS

Все доступные параметры можешь посмотреть на страничке Win32_BIOS class (https://msdn.microsoft.com/en-us/library/aa394077%28v=vs.85%29.aspx), также можешь использовать другой класс (Win32_BaseBoard, Win32_Processor и т.д.) для получения инфы о другом железе

MKN
19-08-2015, 17:18
Подставь, например, Manufacturer или Name за место SerialNumber и получишь значения производителя и версии BIOS »
Ничего не получаю... Вернее при любом раскладе одно и то же :
BIOS Serial Number=failed to get: -2147217406
И при Manufacturer, и при Name ...

K.A.V.
19-08-2015, 17:28
Ничего не получаю... Вернее при любом раскладе одно и то же :
BIOS Serial Number=failed to get: -2147217406
И при Manufacturer, и при Name ... »
У меня твой код работает и в Win7 и в Win10, может, где-то ошибся?
Там в двух местах нужно заменять


; 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

MKN
19-08-2015, 17:32
Там в двух местах нужно заменять »
точно, в двух... Спасибо за подсказку.

kotkovets
19-08-2015, 17:38
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

MKN
19-08-2015, 18:17
Возвращаясь к имитации метро фейса...
При использовании 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

K.A.V.
20-08-2015, 15:51
!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



При быстром наведении курсора, то на одно изображение, то на другое - оба изображения могут выделиться (замениться на другое изображение) »
У себя такого не заметил, единственно что заметил - изображения выделяются, если навести курсор сначала на одно изображение, затем переместить курсор на белую область выше, а затем на второе изображение. Здесь, возможно, поможет добавление того куска кода по определению региона элемента с изображением

При перемещении курсора вне изображений , курсор очень быстро, но глазом заметно, изменяется-мельтешит, превращаясь из стрелки в ладошку и обратно »
Ну так, смотри внимательней на свой код, у тебя команда установки курсора находится перед проверкой на перемещение мыши

В код добавил 2 переменные $SetImage1 и $SetImage2, которые используются для того, чтобы постоянно не присваивать изображения элементам (происходит быстрое мерцание из-за постоянного перемещения мыши и присваивания изображений) в функции MainWndSubProc, возможно, можно обойтись без переменных и как-то поиграться с WM_SETREDRAW - оставлю это тебе

p.s.
Насчет своих изображений кнопкам, есть же плагин SkinnedButton plug-in (http://nsis.sourceforge.net/SkinnedButton_plug-in), если у тебя будут кнопки одного типа - думаю, лучше этим плагом воспользоваться
Кстати, вот можешь скачать архивчик с GitHub (https://github.com/nicecai/nsissource), там примеры своего интерфейса с парой интересных плюшек + свои мессаджбоксы со своим стилем, я сам в этом не разбирался, посмотрел мельком гугля инфу по твоему плагу WndProc

Kopejkin
20-08-2015, 21:59
Склеиваем 2 текстовых файла
Для того, чтобы содержимое одного файла приклеить к другому, используем команду:
${FileJoin} "Файл 1" "Файл 2" "Выходной файл"

По-моему, файловая инструкция FileJoin не поддерживается в NSIS 2.46 и выше...

K.A.V.
20-08-2015, 22:34
По-моему, файловая инструкция FileJoin не поддерживается в NSIS 2.46 и выше... »
эм...с чего бы это?
В начале кода не забыли добавить?
!include "TextFunc.nsh"

Kopejkin
21-08-2015, 09:24
...не забыли »
А я и не знал.. :sorry:
В Справочнике по NSIS об этом ни гу-гу.

Serg866
23-08-2015, 22:51
Ребята, привет.
У меня вопрос по плагину md5
Как заставить его выполнить такую задачу:
нужно чтобы в проверке на оригинальность файла участвовало две хэш-суммы, а не одна.
Ну то есть предположим первая хеш-сумма проверяемого файла не совпадает, тогда идёт проверка на вторую хеш-сумму. Если и она не совпадает - прерывание установки и сообщение, мол версия файла неправильная.
Надеюсь поможете... А то очень понадобилось реализовать такой вариант. Дело в том что в разных версиях моей программы один и тот же файл имеет разные размеры. Вот и нужно чтобы последнее обновление можно было установить на все предыдущие версии программы.

K.A.V.
24-08-2015, 00:03
В Справочнике по NSIS об этом ни гу-гу. »
Ну, не все мелочи там указаны, если при копипасте какого-то примера получаете ошибку, откройте оригинал справки, найдите эту команду и посмотрите в самом начале страничке, есть ли упоминание о включаемых файлах

нужно чтобы в проверке на оригинальность файла участвовало две хэш-суммы, а не одна.
Ну то есть предположим первая хеш-сумма проверяемого файла не совпадает, тогда идёт проверка на вторую хеш-сумму. Если и она не совпадает - прерывание установки и сообщение, мол версия файла неправильная.
Надеюсь поможете... А то очень понадобилось реализовать такой вариант. Дело в том что в разных версиях моей программы один и тот же файл имеет разные размеры. Вот и нужно чтобы последнее обновление можно было установить на все предыдущие версии программы. »
И в чем проблема, собственно? Загоняете хеш-суммы разных версий в свой исходник и сравниваете с той хеш-суммой, которая получится непосредственно в момент подсчета хеша файла, если ни одна сумма, указанная в исходнике не совпадает с той, которая получилась при подсчете - показываете ошибку

md5dll::GetFileMD5 "путь к проверяемому файлу"
Pop $0

${If} $0 != "ad190d8c280f3ebea9cee3aa4514fdc3" ; хеш-сумма первой версии файла
${AndIf} $0 != "cf61b549c003fd4a0274832f4087f92f" ; хеш-сумма второй версии файла
MessageBox MB_OK "Ошибка при проверке хеш суммы, файл испорчен"
quit
${EndIf}




© OSzone.net 2001-2012