Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
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, хоч и было сообщение об отсутствии ключа.
Есть такой известный код определения 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 не виноват
в 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}
переделывать скрипт не имеет смысла.
переделывать скрипт не имеет смысла. »
А как альтернативу wmic ? Разве такой код не работал бы быстрее ? Если нет, то наверное действительно, смысла нет, будем использовать тормозной wmic...
Но он почему то не работает в 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 и т.д.) для получения инфы о другом железе
Подставь, например, Manufacturer или Name за место SerialNumber и получишь значения производителя и версии BIOS »
Ничего не получаю... Вернее при любом раскладе одно и то же :
BIOS Serial Number=failed to get: -2147217406
И при Manufacturer, и при Name ...
Ничего не получаю... Вернее при любом раскладе одно и то же :
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
Там в двух местах нужно заменять »
точно, в двух... Спасибо за подсказку.
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
Возвращаясь к имитации метро фейса...
При использовании 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
!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 и выше...
По-моему, файловая инструкция FileJoin не поддерживается в NSIS 2.46 и выше... »
эм...с чего бы это?
В начале кода не забыли добавить?
!include "TextFunc.nsh"
Kopejkin
21-08-2015, 09:24
...не забыли »
А я и не знал.. :sorry:
В Справочнике по NSIS об этом ни гу-гу.
Ребята, привет.
У меня вопрос по плагину md5
Как заставить его выполнить такую задачу:
нужно чтобы в проверке на оригинальность файла участвовало две хэш-суммы, а не одна.
Ну то есть предположим первая хеш-сумма проверяемого файла не совпадает, тогда идёт проверка на вторую хеш-сумму. Если и она не совпадает - прерывание установки и сообщение, мол версия файла неправильная.
Надеюсь поможете... А то очень понадобилось реализовать такой вариант. Дело в том что в разных версиях моей программы один и тот же файл имеет разные размеры. Вот и нужно чтобы последнее обновление можно было установить на все предыдущие версии программы.
В Справочнике по NSIS об этом ни гу-гу. »
Ну, не все мелочи там указаны, если при копипасте какого-то примера получаете ошибку, откройте оригинал справки, найдите эту команду и посмотрите в самом начале страничке, есть ли упоминание о включаемых файлах
нужно чтобы в проверке на оригинальность файла участвовало две хэш-суммы, а не одна.
Ну то есть предположим первая хеш-сумма проверяемого файла не совпадает, тогда идёт проверка на вторую хеш-сумму. Если и она не совпадает - прерывание установки и сообщение, мол версия файла неправильная.
Надеюсь поможете... А то очень понадобилось реализовать такой вариант. Дело в том что в разных версиях моей программы один и тот же файл имеет разные размеры. Вот и нужно чтобы последнее обновление можно было установить на все предыдущие версии программы. »
И в чем проблема, собственно? Загоняете хеш-суммы разных версий в свой исходник и сравниваете с той хеш-суммой, которая получится непосредственно в момент подсчета хеша файла, если ни одна сумма, указанная в исходнике не совпадает с той, которая получилась при подсчете - показываете ошибку
md5dll::GetFileMD5 "путь к проверяемому файлу"
Pop $0
${If} $0 != "ad190d8c280f3ebea9cee3aa4514fdc3" ; хеш-сумма первой версии файла
${AndIf} $0 != "cf61b549c003fd4a0274832f4087f92f" ; хеш-сумма второй версии файла
MessageBox MB_OK "Ошибка при проверке хеш суммы, файл испорчен"
quit
${EndIf}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC