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
20-02-2015, 17:35
Так тоже не работает? »
Не работает. Заголовок , как прилип...

ps Выяснил, почему не работает. В "визуальных эффектах" обязательно должна быть включена опция "включение композиции рабочего стола".
У меня была отключена, т.к. почти все визуальные эффекты я всегда отключаю за ненадобностью. И не только я один... Т.е. в скрипте с манипуляциями стилями, придётся принудительно включать композицию на время установки...
А вообще , это лажа со строны MS. Пользовательские настройки не должны принципиально влиять на работу программ...
Есть вроде как спец функция для манипуляций с композицией... Обсуждалось, к примеру, здесь http://www.gamedev.ru/code/forum/?id=168231

K.A.V.
23-02-2015, 06:51
ps Выяснил, почему не работает. В "визуальных эффектах" обязательно должна быть включена опция "включение композиции рабочего стола".
У меня была отключена, т.к. почти все визуальные эффекты я всегда отключаю за ненадобностью »
Ну, вот видишь...А я работаю со всеми включенными эффектами :)

Есть вроде как спец функция для манипуляций с композицией... »
Зачем ты всё усложняешь функциями, смотри:
1. Берёшь файл интерфейса modern.exe из папки Contrib\UIs
2. Копируешь в папку со скриптом
3. Открываешь его в ResHacker
4. Переходишь в диалог 105
5. Ставишь свой стиль окна, убирая WS_CAPTION и добавляя, например, WS_BORDER

105 DIALOGEX 0, 0, 331, 222
STYLE DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_BORDER | WS_SYSMENU
CAPTION ""
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
FONT 8, "MS Shell Dlg"
{
CONTROL "", 3, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 166, 201, 50, 14
CONTROL "", 1, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 216, 201, 50, 14
CONTROL "", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 273, 201, 50, 14
CONTROL "", 1018, STATIC, SS_BLACKRECT | WS_CHILD | WS_GROUP, 15, 45, 300, 140
CONTROL "", 1044, STATIC, SS_BLACKRECT | WS_CHILD | WS_GROUP, 0, 0, 331, 193
CONTROL "", 1035, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 193, 321, 1
CONTROL "", 1036, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE | WS_GROUP, 0, 35, 340, 1
CONTROL "", 1045, STATIC, SS_ETCHEDHORZ | WS_CHILD | WS_GROUP, 0, 193, 340, 1
CONTROL "", 1256, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 188, 322, 8
CONTROL "", 1028, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_GROUP, 5, 188, 322, 8
CONTROL "", 1034, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 0, 0, 332, 35
CONTROL "", 1037, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 10, 5, 280, 10
CONTROL "", 1038, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 15, 16, 275, 16
CONTROL 103, 1039, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE | WS_GROUP, 300, 8, 21, 20
}

6. Компилируешь/сохраняешь свои изменения
7. В NSIS скрипте прописываешь в самом начале
!define MUI_UI "modern.exe"
8. Наслаждаешься
Просто баг появляется не из-за того, что в MS косячники (ну, в меньшей степени, я думаю), а из-за того, что мы модифицируем созданное окно, создай его изначально без заголовка - и такой проблемы не будет

ps
не знаю насчет пункта 4, достаточно ли будет изменений только в диалоге 105, лень тестить, оставлю это дело тебе :wink:

psps

Включить
System::Call "Dwmapi::DwmEnableComposition(i1)i.r0"

Отключить
System::Call "Dwmapi::DwmEnableComposition(i0)i.r0"
вроде работает :)

MKN
25-02-2015, 11:06
K.A.V.,

Да. Замена стиля в ресурсе работает.

И, к слову, об изменении ресурсов. Кроме стилей, чаще всего в modern.exe пользователи изменяют размеры окон страниц, кнопок и других элементов (или скрывают не нужные элементы).

Вполне можно было бы сделать на NSIS программку, упрощающую изменение ресурсов в modern.exe Dialog.
Ввёл нужные значения размеров, отметил нужные стили и нажал кнопку, сохранив modern.exe , скажем, как - modern_correct.exe . Было бы весьма полезно.

Но нигде в сети не обнаружил даже намёка, как с помощью NSIS можно изменить/заменить ресурсы файлов.

Хотя... Однажды kotkovets рассказывал, как это делается (правда только для битмапов)... Вот, что я понял из его рассказа-примера и использовал в таком примере (+ добавил некоторые описания...) :

Пример замены ресурса в WinRar 5.21x32 рус ( http://www.rarlab.com/rar/wrar521ru.exe )

Заменим ресурс Bitmap 104 в RarLng.dll. Это - цветная картинка-лейба WinRAR из "Справка" -> "О программе..."

http://s009.radikal.ru/i308/1502/bd/859628a86f6e.jpg

Заменяем эту цветную картинку на черно-белую - из файла 104.bmp :


!include "logiclib.nsh"
ShowInstDetails show
OutFile "replacement_of_ resources_ BMP-test.exe"

!define RT_BITMAP 2 ;Bitmap resource.
/* при необходимости используем :
!define RT_CURSOR 1 ;Hardware-dependent cursor resource.
!define RT_ICONH 3 ;ardware-dependent icon resource.
!define RT_MENU 4 ;Menu resource.
!define RT_DIALOG 5 ;Dialog box.
!define RT_STRING 6 ;String-table entry.
!define RT_FONTDIR 7 ;Font directory resource.
!define RT_FONT 8 ;Font resource.
!define RT_ACCELERATOR 9 ;Accelerator table.
!define RT_RCDATA 10 ;Application-defined resource (raw data).
!define RT_MESSAGETABLE 11 ;Message-table entry.
!define /math RT_GROUP_CURSOR ${RT_CURSOR} + ${RT_MESSAGETABLE}
!define /math RT_GROUP_ICON ${RT_ICONH} + ${RT_MESSAGETABLE}
!define RT_VERSION 16 ;Version resource.
!define RT_DLGINCLUDE 17 ;include heder file
!define RT_PLUGPLAY 19 ;Plug and Play resource.
!define RT_VXD 20 ;DWORD cbData
!define RT_ANICURSOR 21 ;Animated cursor.
!define RT_ANIICON 22 ;Animated icon.
!define RT_HTML 23 ;HTML resource.
!define RT_MANIFEST 24 ;Side-by-Side Assembly Manifest.
*/
Section
System::Store S
FileOpen $0 "$EXEDIR\104.bmp" r
${Unless} ${Errors}
System::Call "kernel32::GetFileSizeEx(ir0,*l.r1)"
;Т.к. мы заменяем растровое изображение (BMP файл), то для его правильной обработки
;сначала необходимо устранить первые 14 байт заголовка растрового изображения.
IntOp $1 $1 - 14
System::Call "kernel32::SetFilePointer(ir0,i14,i0,i0)"
System::Alloc $1
Pop $2
System::Call "kernel32::ReadFile(ir0, ir2, ir1, *i.r3, i0)"
FileClose $0
; BeginUpdateResource - создает описатель для EXE или DLL файла, в котором нужно заменить ресурс
; UpdateResource - используя описатель файла добавляет, удаляет или заменяет в нем ресурсы
; EndUpdateResource - закрывает описатель файла
System::Call "kernel32::BeginUpdateResource(t'$EXEDIR\RarLng.dll', i0)i.r0"
${Unless} $0 == 0
System::Call "kernel32::UpdateResource(ir0, i${RT_BITMAP}, i104, i1033, ir2, ir3)" ; 104 - ресурс , 1033 - язык
System::Call "kernel32::EndUpdateResource(ir0,i0)"
${Else}
DetailPrint "файла для изменения не существует!"
${EndUnless}
System::Free $2
${Else}
DetailPrint "файл для замены не существует!"
${EndUnless}
System::Store L
SectionEnd

Section
SectionEnd


В итоге :

http://s017.radikal.ru/i427/1502/d8/abaaf9002dcb.jpg

Но как заменить в modern.exe Dialog 105 - на откорректированный... Вроде сначала, сохранённый-откорректированный .rc файл надо конвертировать в бинарный вид, а потом уже заменять ресурс...
(Если напрямую заменять .rc ,то заменяться то он вроде как заменяется (точнее изменяется, но без внесённых изменений и при этом получается черт те что) )...
И скорее всего, не так это делается... Тогда как ?

ps Во вложении черно-белая картинка - файл 104.bmp :

K.A.V.
25-02-2015, 21:26
Но нигде в сети не обнаружил даже намёка, как с помощью NSIS можно изменить/заменить ресурсы файлов. »
Вот ты сам подумай, зачем системе создания инсталляторов копаться в содержимом файлов, заменяя их ресурсы? Это явно не задача таких систем.
А если нужно заменить ресурсы - юзай командную строку приложений, которые умеют заменить ресурсы (тот же ResHacker, справка в помощь)

Но как заменить в modern.exe Dialog 105 - на откорректированный... Вроде сначала, сохранённый-откорректированный .rc файл надо конвертировать в бинарный вид, а потом уже заменять ресурс...
(Если напрямую заменять .rc ,то заменяться то он вроде как заменяется (точнее изменяется, но без внесённых изменений и при этом получается черт те что) )...
И скорее всего, не так это делается... Тогда как ? »
Я что-то не понял, ты не можешь через ResHacker сохранить изменения в диалоге 105? Или что? :unsure:

И я не совсем понимаю, зачем менять ресурс непосредственно через NSIS код, если можно произвести все изменения в файле и запихнуть в инсталлер уже готовый файл с изменёнными ресурсами...Или ты делаешь своего рода патчер по замене ресурсов в файлах??

MKN
26-02-2015, 09:24
зачем системе создания инсталляторов копаться в содержимом файлов, заменяя их ресурсы? »
Не системе инсталлятора, а автономной программе на NSIS.
Задачи с заменой ресурсов могут быть разные, к примеру :
интереующая меня (и полезная для многих) программа для удобного и быстрого изменения размеров и пр. у окон конструированного инсталлятора NSIS , в ресурсах modern.exe . Как я уже говорил выше. Конечно всё это можно делать редактором ресурсов - но оч долго и оч не удобно, особенно , если регулярно. :)
И, как ты правильно заметил - разнообразные патчеры ресурсов, как для простой замены какого либо ресурса, так и для корректировки, локализации и т.д.
Оч. полезно в применении для программ с часто меняющимися версиями, где постоянно приходится обновлять ресурсы...
Не нужно каждый раз возиться с ResHacker_ом, особенно если надо заменять десятки параметров в ресурсах... А тут один раз повозился, а далее просто вводи данные (если надо) и жми кнопку :)
Я что-то не понял, ты не можешь через ResHacker сохранить изменения в диалоге 105? »
Сохранить ессно можешь (как файл .rc). Как изменить-заменить его потом, после корректировки, с помощью кода NSIS ?

kotkovets
26-02-2015, 09:56
А каким образом добавить к получившемуся "лысому" окну - рамку ? (пробовал добавлять "рамочные" стили WS_BORDER , WS_THICKFRAME , посылал окну сообщение ${CM_BORDERCHANGED} - без эффекта ) »
насколько помню )), нужно считать в переменную текущие свойства окна и прибавить (IntOp) нужное свойство в форточку.
и применить, все действия в GUIInit.

MKN
26-02-2015, 10:27
нужно считать в переменную текущие свойства окна и прибавить (IntOp) нужное свойство в форточку.
и применить, все действия в GUIInit. »
С этим вроде разобрались - все API манипуляции со стилями окна, перечёркивает отключение композиции раб стола...

Подскажи пожалуйста - как изменить-заменить сохранённый и откорректированный .rc ресурс в modern.exe , с помощью кода NSIS ?

kotkovets
26-02-2015, 16:00
Подскажи пожалуйста - как изменить-заменить сохранённый и откорректированный .rc ресурс в modern.exe , с помощью кода NSIS ? »
Дело в том, что у штатного system.dll проблемы работы со структурами, что требует WinAPi работу с ресурсами,
все это сводит на нет штатными инструментами редактирование ресурсов...
Этот "косяк" сильно ограничивает функциональность расширенных кодов для продвинутого в этом плане NSIS

K.A.V.
27-02-2015, 05:51
Не системе инсталлятора, а автономной программе на NSIS. »
Пошел по моим стопам? :biggrin: Ну, тогда понятно :) Работы то уже есть готовые?

интереующая меня (и полезная для многих) программа для удобного и быстрого изменения размеров и пр. у окон конструированного инсталлятора NSIS , в ресурсах modern.exe . Как я уже говорил выше. Конечно всё это можно делать редактором ресурсов - но оч долго и оч не удобно, особенно , если регулярно. »
Для этого и были созданы такие программы, как ResHacker, какой смысл в создании велосипеда? И я что-то не замечал трудностей при изменении интерфейса через "хакера", всё довольно быстро и удобно делается там...

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

Сохранить ессно можешь (как файл .rc). Как изменить-заменить его потом, после корректировки, с помощью кода NSIS ? »
rc-файл - это формат ResHacker (хоть и обычный текстовый файл), поэтому и заменить данным файлом ресурс можно только через него, используя либо интерфейс, либо обратившись к ResHacker через командую строку

Дело в том, что у штатного system.dll проблемы работы со структурами, что требует WinAPi работу с ресурсами,
все это сводит на нет штатными инструментами редактирование ресурсов... »
Не в теме по функциям api, работающим с ресурсами, но раз такое дело, то в крайнем случае выход для NSIS - написать плагин, только вот браться за это, думаю, мало кто захочет, ибо спрос на такой функционал не велик, как мне кажется

MKN
27-02-2015, 10:49
Пошел по моим стопам? »
Хороший пример - заразителен. :)
rc-файл - это формат ResHacker »
Нет, это общий формат скрипта ресурса (rc script), по сути - просто описание ресурса... Используется повсеместно, как редакторами ресурсов так и программистами при манипуляциях с ресурсами в коде... Но нам с того, применимо для NSIS, не легче... :)
либо обратившись к ResHacker через командную строку »
А вот это попробуем. :) Раз другого выхода нет...

T1cOoN
27-02-2015, 14:40
Товарищи подскажите пожалуйста, есть программа "Фабрика Форматов", инсталлятор на NSIS, устанавливаю с параметров /S для тихой установки, незаметно от пользователей, но инсталлятор по дефолту ставит программу и ярлыки к ней для одного пользователя, а не для всех, есть ли какая то команда для установки "для всех"

K.A.V.
27-02-2015, 15:18
есть ли какая то команда для установки "для всех" »
Стандартно - нет, если автор сборки инсталлятора закладывает в скрипт такие возможности - то будут, и о доступных ключах установки, обычно, сообщается

Что касается конкретно Format Factory - в исходном коде NSIS-скрипта этого продукта такой возможности не заложено, нет упоминания о команде SetShellVarContext, которая бы создавала ярлыки для всех/только для текущего


SetOutPath $_OUTDIR
SetOutPath $INSTDIR\FFModules\Package
File Readme.txt
SetOutPath $INSTDIR\FFModules\Package\BaiDu
File Baidu-TB-ASBar.exe
File hao123inst.exe
SetOutPath $INSTDIR\FFModules\Package\Ask
File AskPIP_FF_.exe
SetOutPath $INSTDIR
StrCmp $_28_ 0 label_417
CreateDirectory $SMPROGRAMS\ёсКЅ№¤і§
CreateShortCut $SMPROGRAMS\ёсКЅ№¤і§\ёсКЅ№¤і§.lnk $INSTDIR\FormatFactory.exe
CreateShortCut $SMPROGRAMS\ёсКЅ№¤і§\°пЦъ.lnk $INSTDIR\FormatFactory.exe /help $INSTDIR\FormatFactory.exe 2
CreateShortCut $DESKTOP\ёсКЅ№¤і§.lnk $INSTDIR\FormatFactory.exe
CreateShortCut $SENDTO\ёсКЅ№¤і§.lnk $INSTDIR\FormatFactory.exe
Goto label_422
label_417:
CreateDirectory $SMPROGRAMS\FormatFactory
CreateShortCut $SMPROGRAMS\FormatFactory\FormatFactory.lnk $INSTDIR\FormatFactory.exe
CreateShortCut $SMPROGRAMS\FormatFactory\Help.lnk $INSTDIR\FormatFactory.exe /help $INSTDIR\FormatFactory.exe 2
CreateShortCut "$DESKTOP\Format Factory.lnk" $INSTDIR\FormatFactory.exe
CreateShortCut "$SENDTO\Format Factory.lnk" $INSTDIR\FormatFactory.exe
label_422:
SectionEnd

MKN
03-03-2015, 16:48
либо обратившись к ResHacker через командую строку »
К сожалению ком строка ResHacker работает только с .res файлами, от которых толка нет ( для поставленной задачи... )
Ведь надо (точнее - возможно) редактировать данные именно в скриптах .rc
Если бы .rc можно было бы преобразовать в файлы .res - тогда другое дело. И вроде как для того существует консольная утилитка brcc32.exe ( из пакета Delphi). Но ни черта она у меня не работает (может требуются какие то доп DLL или ещё что. Про то, не известно...)

K.A.V.
04-03-2015, 07:39
И вроде как для того существует консольная утилитка brcc32.exe ( из пакета Delphi). Но ни черта она у меня не работает (может требуются какие то доп DLL или ещё что »
Ну так, а ты пробовал её запустить без параметров?
Я так всегда делаю, создаю cmd файл и запускаю консольное приложение без параметров, в основном они ругаются, если им что-то нужно

brcc32
pause

В итоге видим в окне консоли:
Fatal error could not create interface with rw32core.dll
достаём нужные файлы и вуаля!

brcc32 "My file.rc"
pause
rc в res компилируется без проблем :)

MKN
06-03-2015, 11:21
Интересно, возможно ли в NSIS скрипте, записывать несколько переменных - в одну строку ? Просто для компактности скрипта... А то, когда назначаешь под сотню собственных переменных получается ну очень огромный столб из переменных... Вроде как, некоторые языки программирования позволяют так делать...

K.A.V.
06-03-2015, 11:55
Просто для компактности скрипта... А то, когда назначаешь под сотню собственных переменных получается ну очень огромный столб из переменных... »
Создай nsh файл, пропиши туда только свои переменные и в основном скрипте подключи этот файл
Если бы я в своём SFX Creator всё пихал в один nsi файл - я бы с ума уже сошел, только главный файл насчитывает 6200 строк кода и это без дополнительных nsh файлов, которые к нему относятся, в котором валяются функции, которые не изменяются...

MKN
13-03-2015, 11:21
Подскажите пожалуйста, каким образом в EXE файле определить - есть ли в нём конкретная HEX строка ?

Например, для этого файла надо определить есть ли в нём такая строка :

A3484BBE986C4AA9994C530A86D6487D (это признак для определения файлов AutoIt3 compiled script executable, для которых классический метод определения по сигнатуре - не подходит...)

этот файл : http://rghost.ru/private/6zgqqPykN/efff5945544c291a4bfe25f76010300c

http://s017.radikal.ru/i426/1503/5a/736e35174534.jpg

Причём у разных файлов, offset разный, но строка A3484BBE986C4AA9994C530A86D6487D - неизменна

http://s019.radikal.ru/i627/1503/e9/65d4d01ec7a2.jpg

K.A.V.
13-03-2015, 20:30
Чтение побайтово очень долго проходит, если искомая строка не в начале файла и если сам файл больше 5-10 Мб...

Готовый код:

Function test
; Используются следующие переменные
; $0 - $7
; $R0, $R1, $R2, $R3
Banner::show /NOUNLOAD ""
Banner::getWindow /NOUNLOAD
var /global banner
Pop $0
GetDlgItem $banner $0 1030

StrCpy $R1 "A3484BBE986C4AA9994C530A86D6487D"
StrCpy $R2 "C:\Windows\Explorer.exe"
strcpy $0 $0 0
StrCpy $R0 "$R1"
stget:
intop $0 $0 + 1
StrCpy $R0 "$R0" -2
StrCmp $R0 "" 0 stget
StrCpy $R0 "$R1" 2 ; записываем первые 2 символа, с них будем начинать чтение байтов подряд, если встретятся в файле
intop $R3 $0 - 1 ; нам нужно знать, сколько последовательно байт считать, чтобы точно сверить всю последовательность байт

StrCpy $1 "0" ; начальный
StrCpy $5 ""
FileOpen $0 "$R2" r
now:
StrCpy $6 0
IntOp $1 $1 + 1
FileSeek $0 "$1" SET $1
IntFmt $2 "0x%08X" $1
SendMessage $Pop2 ${WM_SETTEXT} 0 "STR:[$2] $1"
FileReadByte $0 $3
StrCmp $3 "" no 0
IntFmt $4 "%02X" $3
StrCmp $4 "$R0" 0 now
StrCpy $5 "$4"
getBytes:
IntOp $6 $6 + 1
FileReadByte $0 $3
IntFmt $4 "%02X" $3
StrCpy $5 "$5$4"
StrCmp $6 "$R3" 0 getBytes
StrCmp $5 "$R1" 0 now
MessageBox MB_OK|MB_ICONINFORMATION "$R1$\n$\nНайдено, начиная со смещений:$\nHEX - $2$\nDEC - $1" idok end
no:
MessageBox MB_OK|MB_ICONSTOP "в данном файле нет таких данных"
end:
FileClose $0
Banner::destroy
FunctionEnd


Тебе остаётся только подставить нужную строку и путь к файлу
Код универсальный и не привязан конкретно к твоей строке, можешь вбивать для поиска другие значения любой длины (от 4 символов), вроде работает :)
сори за бардак в переменных, некогда прихорашивать, если нужно, думаю сам в макрос загонишь...?

MKN
14-03-2015, 09:32
Чтение побайтово очень долго проходит, если искомая строка не в начале файла »
Действительно, очень долго... Для практики надо бы побыстрее... Интересно, можно как то по иному реализовать поиск ?
Может подойдёт плагин http://wiz0u.free.fr/prog/nsisFile/ ?

K.A.V.
14-03-2015, 10:09
Интересно, можно как то по иному реализовать поиск ? »
Я в NSIS новичок, поэтому всех тонкостей не знаю, может, можно как-то и быстрее :)

Может подойдёт плагин http://wiz0u.free.fr/prog/nsisFile/ ? »
Подошел


Function test
FileOpen $2 "$EXEDIR\VirtualBox-4.3.24-98716-Win.exe" r
nsisFile::FileFindBytes "$2" "A3484BBE986C4AA9994C530A86D6487D" "-1"
pop $1
FileClose $2
MessageBox MB_OK|MB_ICONINFORMATION "$1"
FunctionEnd

Если не найдено $1 = "-1"
Если найдено $1 = смещение по DEC




© OSzone.net 2001-2012