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

MKN
14-03-2015, 10:16
Я в NSIS новичок, поэтому всех тонкостей не знаю »
Если бы все были такими "новичками"... :) то давно бы Windows на NSIS переписали. :)

MaGoth
15-03-2015, 07:48
Привет народ,
Имеется вопрос.. Ковыряю один инсталлер, формально всё по тех. части оригинального уже воссоздал и прописал что нужно..
Но, не работает как надо только кусок мелкого оформления. Не отображаются тексты на странице Велком и её заголовка..

Пример в картинках:
Оригинал:
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

K.A.V.
15-03-2015, 10:54
Не отображаются тексты на странице Велком и её заголовка.. »
Они отображаются, просто цвет текста к этому тексту не применяется, у вас заливается черным фоном и текст тоже остаётся черным.

В чем грабля может быть ?! »
В том, что дефинька:
!define MUI_TEXTCOLOR »
вообще в NSIS не существует, ни в 2.46 ни в 3.0b1, ни в документации о ней не сказано, ни в include файлах настроек интерфейсов её нет

MUI_BGCOLOR есть, а вот MUI_TEXTCOLOR нет, соответственно, цвет на фон то применяется, а на текст - нет
Пишите свою функцию с установкой цветов на тексты командой SetCtlColors, либо ковыряйте include файл интерфейса и добавляйте такую дефиньку, чтобы применяла цвета на текст

MaGoth
20-03-2015, 08:39
K.A.V.,
Не напомнишь случаем хенделы этих текстовых полей и окна..? Ковырял ковырял интерфес, но что-то кроме как изменения цвета фона в них, ничего более не наковырял. Может ковырялка не того калибра ?!
Да и залезть в ресурсы интерфейса пока нет возможности...

K.A.V.
20-03-2015, 12:19
Да и залезть в ресурсы интерфейса пока нет возможности... »
Я вам про ресурсы и не говорил...

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?

K.A.V.
30-03-2015, 17:21
Как определить за 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

MKN
31-03-2015, 17:00
Необходимо переименовать все файлы в папке, чтобы вместо имён была нумерация ( варианты 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
Но почему то получается хаотичное переименование, особенно если много файлов...

K.A.V.
31-03-2015, 18:31
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 функцию, она просто завершается - из-за этого этот вариант отпадает :(

MKN
31-03-2015, 18:44
после переименования файл считается "новым", т.е. ещё не перечисленным, отсюда такой результат »
я где то читал, чтобы избежать этого, после переименования файл(ы) сразу же перемещают в другую папку.
Наверное такое переименование проще сделать батником. Там это в три строки делается...

MKN
01-04-2015, 12:22
Вариант с перемещением вроде как работает, но отсчёт начинается почему то с 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

K.A.V.
01-04-2015, 18:02
но отсчёт начинается почему то с 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"

MKN
02-04-2015, 10:04
в переменную имени файла сбрасывается значение "." и ".." »
точно так, прозевал этот момент... А с чего вдруг образуются эти странные значения ?
одной разве не достаточно? »
Начинал с одной, но почему то получается ахинея с нумерацией, если файлов много и имена начинаются с цифр...

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

K.A.V.
03-04-2015, 22:51
А с чего вдруг образуются эти странные значения ? »
яжнепрограммист, откуда я знаю, видимо, из-за того, что перечисляются все файлы, а не конкретного типа :)

Было бы интересно переконвертировтаь этот код в 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

MKN
04-04-2015, 14:21
wolkow70,
нет такого "=>" »
потому что нет...
есть (во всяком случае в С# ) :
>= Больше или равно

K.A.V.
04-04-2015, 14:27
Что-то не могу собрать скрипт с конструкцией типа:
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
потому что нет...
есть :
>= Больше или равно »

Благодарствую за подсказку.
В таком случае, нужно авторам Справочника поправить ошибку, так как пример оттуда.

Вам нужно указать >= »
Спасибо за подсказку, заработало.

MKN
09-04-2015, 13:41
Столкнулся с не возможностью совместного использования "FileVerInfo.nsh" и "FileFunc.nsh". При компиляции - ругань (отдельно, FileVerInfo.nsh работает нормально) .
Как их подружить ?

K.A.V.
09-04-2015, 13:56
Столкнулся с не возможностью совместного использования "FileVerInfo.nsh" и "FileFunc.nsh" »
FileVerInfo.nsh - что это и где его достать то? В дистрибутиве NSIS - нету, поиском по сайту NSIS - нету, лениво вбил в гугл - и снова ничего




© OSzone.net 2001-2012