Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Я в NSIS новичок, поэтому всех тонкостей не знаю »
Если бы все были такими "новичками"... :) то давно бы Windows на NSIS переписали. :)
Привет народ,
Имеется вопрос.. Ковыряю один инсталлер, формально всё по тех. части оригинального уже воссоздал и прописал что нужно..
Но, не работает как надо только кусок мелкого оформления. Не отображаются тексты на странице Велком и её заголовка..
Пример в картинках:
Оригинал:
123268 123269
Восстановленный:
123270 123271
;===============================================================================
;Modification Development Kit Setup Script
;===============================================================================
; Conditional Compilation
; !define MDK_SMALL ; exclude stuff
!define MDK_COLOR ; modified NSIS
; !define MOD_INCLUDE_PLAYERKIT
; Compiler Settings
CRCCheck force
SetCompressor lzma
!ifdef G2MDK_SMALL
SetCompressorDictSize 128 ; see RAM table
!else
SetCompressorDictSize 32 ; see RAM table
!endif
; DictSize Compress Decompress
; 8 MB 141 MB 10 MB (default)
; 12 MB 179 MB 14 MB
; 16 MB 217 MB 18 MB
; 24 MB 293 MB 26 MB
; 32 MB 369 MB 35 MB
; 48 MB 521 MB 50 MB
; 64 MB 673 MB 66 MB
; 96 MB 977 MB 98 MB
; 128 MB 1281 MB 130 MB
; 192 MB 1889 MB 194 MB
AllowRootDirInstall true
!ifdef G2MDK_SMALL
!packhdr "packhdr.tmp" "upx --best packhdr.tmp"
!endif
; Includes
!include "MUI.nsh"
!include "Sections.nsh"
!include ".\setup\g2mod.nsh"
; Version Definitions
!define VER_MAJOR 0
!define VER_MINOR 0
!define VER_PATCH 0
!define VER_FLAGS 0
!define VER_TEXT "${VER_MAJOR}.${VER_MINOR}"
!ifndef G2MDK_SMALL
!define VER_FILE "${VER_MAJOR}.${VER_MINOR}"
!else
!define VER_FILE "${VER_MAJOR}.${VER_MINOR}"
!endif
!define NAME_LONG "Modification Development Kit"
!define UNREG_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\MDK"
OutFile "..."
InstallDir "..."
InstallDirRegKey HKLM "..."
;===============================================================================
; MUI
Name "G2MDK ${VER_TEXT}"
;BrandingText "${NAME_LONG}"
;LicenseForceSelection radiobuttons
; Configuration (all)
!ifdef MDK_COLOR
!define MUI_BGCOLOR "000000"
!define MUI_TEXTCOLOR "CDCBEB"
!define MUI_FINISHPAGE_LINK_COLOR "0xFDF8F8"
!endif
!define MUI_ICON ".ico"
!define MUI_UNICON ".ico"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_RIGHT
!define MUI_HEADERIMAGE_BITMAP ".bmp"
!define MUI_WELCOMEFINISHPAGE_BITMAP ".bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP ".bmp"
; Configuration (Installer)
!define MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_WELCOMEPAGE_TEXT "Dieser Assistent wird Sie durch die Installation \
von MDK (${NAME_LONG}) begleiten.\r\n\r\nEs wird empfohlen vor der \
Installation alle anderen Programme zu schlieЯen.\r\n\r\n$_CLICK"
!define MUI_FINISHPAGE_NOREBOOTSUPPORT
!define MUI_FINISHPAGE_TITLE_3LINES
!define MUI_FINISHPAGE_LINK "..."
!define MUI_FINISHPAGE_LINK_LOCATION "..."
; Setup Pages (Installer)
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ".rtf"
Page custom PageReinstall PageLeaveReinstall
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
; Configuration (Uninstaller)
!define MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_WELCOMEPAGE_TEXT "Dieser Assistent wird Sie durch die \
Deinstallation von GMDK (${NAME_LONG}) begleiten.\r\n\r\n\
Bitte beenden Sie alle MDK-Tools,\r\n\
bevor Sie mit der Deinstallation fortfahren.\r\n\r\n$_CLICK"
!define MUI_FINISHPAGE_TITLE_3LINES
; Setup Pages (Uninstaller)
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
; Setup Language
!insertmacro MUI_LANGUAGE "German"
; Reserve Files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
...
Код восстанавливал изучая оригинал(написан на базе Нсиськи 2.0), сам использую Нсис юникод 2.46.5.
Компилил как в Анси, так и в Юнике, и взде одинаково, - текст не отображается..
В чем грабля может быть ?! :clever-ma
Не отображаются тексты на странице Велком и её заголовка.. »
Они отображаются, просто цвет текста к этому тексту не применяется, у вас заливается черным фоном и текст тоже остаётся черным.
В чем грабля может быть ?! »
В том, что дефинька:
!define MUI_TEXTCOLOR »
вообще в NSIS не существует, ни в 2.46 ни в 3.0b1, ни в документации о ней не сказано, ни в include файлах настроек интерфейсов её нет
MUI_BGCOLOR есть, а вот MUI_TEXTCOLOR нет, соответственно, цвет на фон то применяется, а на текст - нет
Пишите свою функцию с установкой цветов на тексты командой SetCtlColors, либо ковыряйте include файл интерфейса и добавляйте такую дефиньку, чтобы применяла цвета на текст
K.A.V.,
Не напомнишь случаем хенделы этих текстовых полей и окна..? Ковырял ковырял интерфес, но что-то кроме как изменения цвета фона в них, ничего более не наковырял. Может ковырялка не того калибра ?!
Да и залезть в ресурсы интерфейса пока нет возможности...
Да и залезть в ресурсы интерфейса пока нет возможности... »
Я вам про ресурсы и не говорил...
include файл интерфейса »
!include "MUI.nsh"
который перенаправляет нас в
C:\Program Files (x86)\NSIS\Contrib\Modern UI\System.nsh
в котором прописаны все детали интерфейса, установка цветов, текста, изображений и т.д.
Не напомнишь случаем хенделы этих текстовых полей и окна..? »
Если речь идёт о странице приветствия и финиша - то там по-другому они получаются, т.к. странички эти создаются с помощью InstallOptions, хэндлы элементов можно получить чтением данных из INI файла настроек ($PLUGINSDIR\ioSpecial.ini), который создаётся перед показом страницы приветствия/финиша, сделать это можно в функции
MUI_PAGE_CUSTOMFUNCTION_SHOW
В своём коде замените ваши куски этими:
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "WelcomeFinishColors_K.A.V._Example"
; Setup Pages (Installer)
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ".rtf"
Page custom PageReinstall PageLeaveReinstall
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "WelcomeFinishColors_K.A.V._Example"
!insertmacro MUI_PAGE_FINISH
; Setup Pages (Uninstaller)
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "un.WelcomeFinishColors_K.A.V._Example"
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "un.WelcomeFinishColors_K.A.V._Example"
!insertmacro MUI_UNPAGE_FINISH
Обратите внимание, что необходимо прописывать CUSTOMFUNCTION и перед страничкой приветствия, и перед страничкой финиша
И ещё обратите внимание на то, что необходимо использовать 2 разные функции для установщика и деинсталлятора
сами функции
Function WelcomeFinishColors_K.A.V._Example
ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 2" "HWND"
SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 3" "HWND"
SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
GetDlgItem $0 $HWNDPARENT 1037
SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
GetDlgItem $0 $HWNDPARENT 1038
SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
FunctionEnd
Function un.WelcomeFinishColors_K.A.V._Example
ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 2" "HWND"
SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 3" "HWND"
SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
GetDlgItem $0 $HWNDPARENT 1037
SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
GetDlgItem $0 $HWNDPARENT 1038
SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
FunctionEnd
Limonica
30-03-2015, 12:06
Как определить за NAT находится пк или нет с помощью NSIS?
Как определить за NAT находится пк или нет с помощью NSIS? »
Вы хотите решение в 1 строчку кода?
Я, например, не шарю в сетевых технологиях и чтобы понять, чего вы действительно хотите от кода - я перед написанием кода должен проштудировать документацию относительно вашего вопроса и только после этого понять, какой функционал необходим в коде
Если готового плагина/решения нет на сайте NSIS - то я должен буду сначала понять, что такое NAT и понять, что нужно для того, чтобы приступить к написанию кода к определению за NAT/не за NAT, а это дополнительное потраченное время, лично для меня это время будет потрачено зря, т.к. мне эта тема не интересна
Так вот что хотелось бы сказать в итоге (и, думаю, нужно внести эти "пожелания-инструкции" в шапку в каком-нибудь более понятном формате, если я не очень грамотно выражусь сейчас):
Если вы просите помощи в написании кода, описывайте подробно, какие команды необходимо видеть в коде, т.к. не все мы тут супер-мега-опытные-знающие всё обо всём в мире IT, сократите время ожидания кода себе и уважайте время тех, кто вам помогает.
Например, по вашему вопросу можно было бы составить сообщение типа такого (опять же, если я всё правильно понял про NAT, прочитав инфу в инете):
Как определить за NAT находится пк или нет с помощью NSIS? Если готового решения нет, то необходим следующий функционал:
1. Определить IP адрес локальной машины
2. Определить, входит ли этот адрес в диапазоны локальных зарезервированных сетей типа 192.168.255.255, 10.255.255.255 и бла бла бла перечисляем дальше
Т.е. по сути, нам что нужно, определить это? Если IP адрес компьютера входит в диапазон локальных сетей, то мы за NAT?
Если я всё правильно понял, то можно реализовать так (или не так, если я всё-таки нифига не понял :)):
В любом случае, может быть, код кому-нибудь пригодится, если это не решение вашего вопроса)
Name "GetIP Test"
OutFile "GetIP Test.exe"
Function .onInit
call GetIP
quit
FunctionEnd
Function GetIP
System::Alloc 400
pop $R0
System::Call 'ws2_32::WSAStartup(i 0x202, i R0)'
System::Call 'ws2_32::gethostname(t .r0, i ${NSIS_MAX_STRLEN}) i .r1'
System::Call 'ws2_32::gethostbyname(t "$0") i.R1'
System::Call '*$R1(&v12,*i.R2)'
System::Call '*$R2(i.R3)'
System::Call 'ws2_32::inet_ntoa(i R3) t.R4'
System::Call 'ws2_32::WSACleanup()'
System::Free $R0
; $0 - имя хоста
; $R4 - IP адрес
Push '$R4'
Call CheckIP
Pop $0
; в $0 результат, смотрим инфу ниже:
; 1 - LoopBack IP (localhost, indicates no connection to a LAN or to the internet).
; 2 - Automatic Private IP Address (no DHCP server).
; 3 - Network IP.
; 4 - Internet IP.
StrCpy $1 "Мы за NAT"
StrCmp $0 "4" 0 +2
StrCpy $1 "Мы не за NAT"
MessageBox MB_OK|MB_ICONINFORMATION "IP - $R4$\noutput - $0$\n$\n$1"
FunctionEnd
Function CheckIP
Exch $0
Push $1
; Check 127.x.x.x
Push '127.0.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' Range1 ; IP cannot be in range of LoopBack addresses
Push '127.255.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 LoopBack ; We found a LoopBack IP
; Check 10.x.x.x
Range1:
Push '10.0.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' Range2 ; IP cannot be in range 1
Push '10.255.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 LanIp ; We found a LanIp
; Check 172.16.x.x to 172.31.x.x
Range2:
Push '172.16.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' Range3 ; IP cannot be in range 2
Push '172.31.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 LanIp ; We found a LanIp
; Check 192.168.x.x
Range3:
Push '192.168.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' Range4 ; IP cannot be in range 3
Push '192.168.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 LanIp ; We found a LanIp
; Check 169.254.x.x
Range4:
Push '169.254.0.0'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 2 '' InternetIp ; It should be an internet IP
Push '169.254.255.255'
Push $0
Call VersionCheck
Pop $1
StrCmp $1 1 APA ; We found an Automatic Private IP Address
Goto InternetIp ; Remaining addresses are internet IPs
LoopBack:
StrCpy $1 1
Goto Exit
APA:
StrCpy $1 2
Goto Exit
LanIp:
StrCpy $1 3
Goto Exit
InternetIp:
StrCpy $1 4
Exit:
Exch $1
Exch 1
Exch $0
Exch 1
FunctionEnd
Function VersionCheck
Exch $0 ;second versionnumber
Exch
Exch $1 ;first versionnumber
Push $R0 ;counter for $0
Push $R1 ;counter for $1
Push $3 ;temp char
Push $4 ;temp string for $0
Push $5 ;temp string for $1
StrCpy $R0 "-1"
StrCpy $R1 "-1"
Start:
StrCpy $4 ""
DotLoop0:
IntOp $R0 $R0 + 1
StrCpy $3 $0 1 $R0
StrCmp $3 "" DotFound0
StrCmp $3 "." DotFound0
StrCpy $4 $4$3
Goto DotLoop0
DotFound0:
StrCpy $5 ""
DotLoop1:
IntOp $R1 $R1 + 1
StrCpy $3 $1 1 $R1
StrCmp $3 "" DotFound1
StrCmp $3 "." DotFound1
StrCpy $5 $5$3
Goto DotLoop1
DotFound1:
Strcmp $4 "" 0 Not4
StrCmp $5 "" Equal
Goto Ver2Less
Not4:
StrCmp $5 "" Ver2More
IntCmp $4 $5 Start Ver2Less Ver2More
Equal:
StrCpy $0 "0"
Goto Finish
Ver2Less:
StrCpy $0 "1"
Goto Finish
Ver2More:
StrCpy $0 "2"
Finish:
Pop $5
Pop $4
Pop $3
Pop $R1
Pop $R0
Pop $1
Exch $0
FunctionEnd
Section
SectionEnd
Необходимо переименовать все файлы в папке, чтобы вместо имён была нумерация ( варианты 0,1,2 и т.д. или 01, 02 и т.д. или 001 002 и т.д. ) без расширений
Также интересует выборочное переименование , типа, переимен. начиная с такого то по такой то файл и др сочетания...
Использовал такой код :
outfile rename_enumerate-test.exe
Var /global n
Section
StrCpy $n 0
ClearErrors
FindFirst $0 $1 $EXEDIR\D\*.*
loop:
StrCmp $1 "" done
Rename "$EXEDIR\D\$1" "$EXEDIR\D\$n"
FindNext $0 $1
IntOp $n $n + 1
Goto loop
done:
FindClose $0
SectionEnd
Но почему то получается хаотичное переименование, особенно если много файлов...
Function RenameFiles
Var /global n
StrCpy $n 1
Delete "$TEMP\tmpfile.ini"
ClearErrors
FindFirst $0 $1 $DESKTOP\D\*.*
loop:
StrCmp $1 "" done
StrCmp $1 "." next
StrCmp $1 ".." next
ReadINIStr $2 "$TEMP\tmpfile.ini" "tmp" "$1"
StrCmp $2 "1" next 0
Rename "$DESKTOP\D\$1" "$DESKTOP\D\$n"
WriteINIStr "$TEMP\tmpfile.ini" "tmp" "$n" "1"
IntOp $n $n + 1
next:
FindNext $0 $1
Goto loop
done:
FindClose $0
Delete "$TEMP\tmpfile.ini"
FunctionEnd
Но почему то получается хаотичное переименование, особенно если много файлов... »
Ты упустил 1 очень важный момент: после переименования файл считается "новым", т.е. ещё не перечисленным, отсюда такой результат, переименованные файлы вновь перечисляются и получается каша в именах, поэтому код отрабатывает не так, как нам бы хотелось
Соответственно, чтобы сделать этот процесс правильным - нам нужно запоминать, какой файл уже был переименован (чтобы повторно его не обрабатывать), для этого сбрасываем имена переименованных файлов во временный файл и перед каждой командой переименования проверяем наличие записи о текущем файле
Ещё один момент, когда перечисляешь все файлы в папке командой Find*, в переменную имени файла сбрасывается значение "." и "..", из-за чего счетчик так же может быть не правильным, проверку на эти значения я так же прописал
Ну и ещё один момент - счетчик нужно менять только после операции переименования, а не после/перед командой FindNext, т.к. опять же, счетчик будет не правильным
Также интересует выборочное переименование , типа, переимен. начиная с такого то по такой то файл и др сочетания... »
Типа будет конкретика - будет и код, нет желания потом опять переписывать код по причине недопонимания/недостаточности подробностей
p.s.
я бы вообще, сделал всё это дело через функцию Locate (красивее/удобнее), но т.к. она багованная с самого 2.46 и при указании некоторых команд (например ReadINIStr) в callback функцию, она просто завершается - из-за этого этот вариант отпадает :(
после переименования файл считается "новым", т.е. ещё не перечисленным, отсюда такой результат »
я где то читал, чтобы избежать этого, после переименования файл(ы) сразу же перемещают в другую папку.
Наверное такое переименование проще сделать батником. Там это в три строки делается...
Вариант с перемещением вроде как работает, но отсчёт начинается почему то с 2. Как исправить ?
outfile rename_enumerate-test.exe
Var /global n
Section
StrCpy $n 0
ClearErrors
FindFirst $0 $1 $EXEDIR\D\*.*
loop:
StrCmp $1 "" done
Rename "$EXEDIR\D\$1" "$EXEDIR\D1\$1"
Rename "$EXEDIR\D1\$1" "$EXEDIR\D1\0$n"
IntOp $n $n + 1
FindNext $0 $1
Goto loop
done:
FindClose $0
SectionEnd
но отсчёт начинается почему то с 2 »
Я же в посте выше всё описал...
Ещё один момент, когда перечисляешь все файлы в папке командой Find*, в переменную имени файла сбрасывается значение "." и "..", из-за чего счетчик так же может быть не правильным, проверку на эти значения я так же прописал »
outfile rename_enumerate-test.exe
Var /global n
Section
StrCpy $n 0
ClearErrors
FindFirst $0 $1 $EXEDIR\D\*.*
loop:
StrCmp $1 "" done
StrCmp $1 "." next
StrCmp $1 ".." next
Rename "$EXEDIR\D\$1" "$EXEDIR\D1\$1"
Rename "$EXEDIR\D1\$1" "$EXEDIR\D1\0$n"
IntOp $n $n + 1
next:
FindNext $0 $1
Goto loop
done:
FindClose $0
SectionEnd
p.s.
а зачем, вообще, ты 2 раза команду прописываешь? одной разве не достаточно?
Rename "$EXEDIR\D\$1" "$EXEDIR\D1\0$n"
в переменную имени файла сбрасывается значение "." и ".." »
точно так, прозевал этот момент... А с чего вдруг образуются эти странные значения ?
одной разве не достаточно? »
Начинал с одной, но почему то получается ахинея с нумерацией, если файлов много и имена начинаются с цифр...
ps Возвращаясь к поиску HEX значений в файлах, для которых "класический" код работает , как черепаха, т.е. не годен для практики.
Оказывается есть иной приём поиска. HEX-последовательность ищется сначала в первых 300 кб, потом в следующих и т.д.
Поэтому поиск выполняется очень быстро. Есть и готовая реализация, но на AutoIt3. Было бы интересно переконвертировтаь этот код в NSIS...
#cs HEX-последовательность ищется сначала в первых 300 кб, потом в следующих и т.д.
Поэтому поиск выполняется очень быстро.
#ce
Opt('MustDeclareVars', 1)
;~ поменяйте $sFile и $sHex на свои
Global $sFile = 'C:\ProgramNoAdmin\AutoIt3_381\AutoIt3.exe', $sHex = 'C4 04 84 C0 74 0B 84 DB 75 2D 32 C0 5B 8B E5', _
$iOffSet, $hFile, $sRead
$iOffSet = _Find_HexString_In_File($sFile, $sHex)
If @error Then Exit ConsoleWrite('Error: ' & @error & @LF)
If Not $iOffSet Then Exit ConsoleWrite('Not hex string' & @LF)
ConsoleWrite('Offset = ' & $iOffSet & ' (hex offset = 0x' & Hex($iOffSet, 8) & ')' & @LF)
;~ проверяем полученный результат:
$hFile = FileOpen($sFile, 16)
FileSetPos($hFile, $iOffSet, 0);$FILE_BEGIN = 0
$sRead = Hex(FileRead($hFile, StringLen(StringStripWS($sHex, 8)) / 2))
FileClose($hFile)
ConsoleWrite($sRead & @TAB & ($sRead = StringStripWS($sHex, 8)) & @LF)
#cs
Вернет при успехе позицию вхождения $s_HexString в файле $s_File или 0, если нет вхождения.
При неудаче вернет 0 и флаг @error = :
1 - нет файла $s_File;
2 - длина $s_HexString не кратна 2;
3 - не получилось открыть файл $s_File;
4 - ошибка функции FileSetPos.
Читает весь файл подряд по 300 Кб, можно поменять на нужные Вам
#ce
Func _Find_HexString_In_File($s_File, $s_HexString)
Local Const $i_Read = 300 * 1024, $__FILE_CURRENT_ = 1
Local $i_Len, $h_File, $b_Read, $i_Pos, $i_Count, $i_Err
If Not FileExists($s_File) Then Return SetError(1, 0, 0)
If IsBinary($s_HexString) Then
$s_HexString = Hex($s_HexString)
Else
$s_HexString = StringStripWS($s_HexString, 8)
EndIf
$i_Len = StringLen($s_HexString)
If Mod($i_Len, 2) Then Return SetError(2, 0, 0)
$i_Len /= 2
$h_File = FileOpen($s_File, 16)
If $h_File = -1 Then Return SetError(3, 0, 0)
While 1
$b_Read = FileRead($h_File, $i_Read)
If @extended <= $i_Len Then ExitLoop
$i_Pos = StringInStr($b_Read, $s_HexString, 2)
If Mod($i_Pos, 2) Then ExitLoop
$i_Pos = 0
If Not FileSetPos($h_File, -$i_Len, $__FILE_CURRENT_) Then
$i_Err = 4
ExitLoop
EndIf
$i_Count += 1
WEnd
FileClose($h_File)
If $i_Err Then Return SetError($i_Err, 0, 0)
If $i_Pos Then Return Int(($i_Pos - 1) / 2 - 1 + ($i_Read - $i_Len) * $i_Count)
Return 0
EndFunc ;==>_Find_HexString_In_File
А с чего вдруг образуются эти странные значения ? »
яжнепрограммист, откуда я знаю, видимо, из-за того, что перечисляются все файлы, а не конкретного типа :)
Было бы интересно переконвертировтаь этот код в NSIS... »
Вот кому интересно, тот пусть и конвертирует, я AutoIt3 не знаю и разбираться в неизвестном мне языке как-то не особо хочется
wolkow70
04-04-2015, 14:01
Что-то не могу собрать скрипт с конструкцией типа:
Section
StrCpy $0 "7"
${If} $0 => 5
MessageBox MB_OK "$0=>5"
${EndIf}
SectionEnd
Показывает, что нет такого "=>"
!insertmacro: macro named "_=>" not found!
Пример секции из справки, библиотека LogicLib.nsh есть, но у меня старый NSIS 2.46
wolkow70,
нет такого "=>" »
потому что нет...
есть (во всяком случае в С# ) :
>= Больше или равно
Что-то не могу собрать скрипт с конструкцией типа:
Section
StrCpy $0 "7"
${If} $0 => 5
MessageBox MB_OK "$0=>5"
${EndIf}
SectionEnd
Показывает, что нет такого "=>"
!insertmacro: macro named "_=>" not found!
Пример секции из справки, библиотека LogicLib.nsh есть, но у меня старый NSIS 2.46 »
Опечатка в нашем файле справки.
Вам нужно указать >=
; The following "expressions" are available:
; Standard (built-in) string tests (which are case-insensitive):
; a == b; a != b
; Additional case-insensitive string tests (using System.dll):
; a S< b; a S>= b; a S> b; a S<= b
; Case-sensitive string tests:
; a S== b; a S!= b
; Standard (built-in) signed integer tests:
; a = b; a <> b; a < b; a >= b; a > b; a <= b
; Standard (built-in) unsigned integer tests:
; a U< b; a U>= b; a U> b; a U<= b
; 64-bit integer tests (using System.dll):
; a L= b; a L<> b; a L< b; a L>= b; a L> b; a L<= b
; ptrdiff_t integer tests
; a P= b; a P<> b; a P< b; a P>= b; a P> b; a P<= b
; Built-in NSIS flag tests:
; ${Abort}; ${Errors}; ${RebootFlag}; ${Silent}
; Built-in NSIS other tests:
; ${FileExists} a
; Any conditional NSIS instruction test:
; ${Cmd} a
; Section flag tests:
; ${SectionIsSelected} a; ${SectionIsSectionGroup} a;
; ${SectionIsSectionGroupEnd} a; ${SectionIsBold} a;
; ${SectionIsReadOnly} a; ${SectionIsExpanded} a;
; ${SectionIsPartiallySelected} a
Примеры использования есть так же в файле "<NSIS>\Examples\LogicLib.nsi"
wolkow70
04-04-2015, 14:28
потому что нет...
есть :
>= Больше или равно »
Благодарствую за подсказку.
В таком случае, нужно авторам Справочника поправить ошибку, так как пример оттуда.
Вам нужно указать >= »
Спасибо за подсказку, заработало.
Столкнулся с не возможностью совместного использования "FileVerInfo.nsh" и "FileFunc.nsh". При компиляции - ругань (отдельно, FileVerInfo.nsh работает нормально) .
Как их подружить ?
Столкнулся с не возможностью совместного использования "FileVerInfo.nsh" и "FileFunc.nsh" »
FileVerInfo.nsh - что это и где его достать то? В дистрибутиве NSIS - нету, поиском по сайту NSIS - нету, лениво вбил в гугл - и снова ничего
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC