Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   BINARY - последовательность значений параметров в реестре. (http://forum.oszone.net/showthread.php?t=183284)

semiono 18-08-2010 19:02 1476535

BINARY - последовательность значений параметров в реестре.
 
Как красиво записать строку?

Код:

$x = Binary(0) & Binary(24) & Binary(@DesktopWidth) & Binary(@DesktopHeight-52) & Binary(0)

RegWrite("HKCU\Software\PowerISO", "MainWindow", "REG_BINARY", $x)

Всмысле может быть есть лучший способ, чем я "забор нагородил" ?

Как-то так нельзя - BinaryString(0,24 & @DesktopWidth... итп...) ?

semiono 20-08-2010 18:31 1478158

Эта тема ждёт ответа, если глупый вопрос, то удалите тему. :)
Просто скрипт готов, и пора его кампильнуть. ))
---
А вообще суперзадача, если бы старые данные не трогать, а только записать нужные байты с определённой позиции в строке! Это лучшее решение. Позицию в строке всегда можно указать явно, парсить и искать тут не нужно.

Насколько я понял, там обычно всегда данные записанны кусками по четыре байта. То-есть в моём примере
надо заменить @DesktopWidth в строке начиная с девятого байта строки. И сам @DesktopWidth тоже знимает 4 байта,
только в перевёрнутом "форматированном" виде Binary() - 2048(десятичное) >
800(хекс) > 00 80 00 00(интелевское) :)

amel27 21-08-2010 14:03 1478578

Код:

$tReg = DllStructCreate("int;int Data;int Width;int Height;int")
$tBin = DllStructCreate("byte["& DllStructGetSize($tReg) &"]", DllStructGetPtr($tReg))

DllStructSetData($tReg, "Data"  , 24)
DllStructSetData($tReg, "Width" , @DesktopWidth)
DllStructSetData($tReg, "Height", @DesktopHeight-52)

RegWrite("HKCU\Software\PowerISO", "MainWindow", "REG_BINARY", DllStructGetData($tBin,1))


semiono 22-08-2010 00:19 1478998

Кто нибудь пожалуйста можете прокоментировать, что это делает:
Код:

$tBin = DllStructCreate("byte["& DllStructGetSize($tReg) &"]", DllStructGetPtr($tReg))
Хочется всётаки понимать написаное :)

amel27 22-08-2010 09:00 1479079

semiono

Думаю понятно, что одну последовательность байтов (блок памяти) можно интепретировать по разному - как массив целых, рациональных или действительных чисел, либо как массив ANSI/UNICODE/... знаков (текстовая строка) или еще как... При создании структуры через DllStructCreate() мы как раз и задаем пособ кодирования набора байтов: "int;int Data;int Width;int Height;int" - последовательность из 5 целых чисел по 4 байта =20 байт, а три элемента структуры по ходу именуем для удобства обращения.

Но при создании новой структуры мы можем указать на уже существующую структуру (последний параметр DllStructCreate()), в этом случае память под структуру не выделяется, мы лишь "перекодируем" данные первой структуры, в примере - как простую последовательность байтов - "byte[20]".

Само собой, длина второй "виртуальной" структуры не должна превышать (в байтах) длину первой "реальной" структуры, иначе последствия могут быть печальными. В нашем случае структуры одинаковой длины (DllStructGetSize() как раз возвращает длину структуры в байтах), поэтому определять их можно в любом порядке:

Код:

$tBin = DllStructCreate("byte[20]")
$tReg = DllStructCreate("int;int Data;int Width;int Height;int", DllStructGetPtr($tBin))


semiono 22-08-2010 14:00 1479285

Для меня в основном не понятно, то что по документации DllStructCreate() инициализируется так
(разрядность имя;разрядность имя;разрядность имя;разрядность имя)
Хотя глядя на запись byte[20] можно понять, что в скобках можно ещё и указать количество,
а само имя можно иногда опустить.
Но ещё и указатель , DllStructGetPtr($tReg) )
...вообщем из справки всего этого не понятно, всех возможных определений.
Меня смутило не суперпозиция функций DllStructCreate(DllStructGetSize(), DllStructGetPtr())
а замена типов данных на указатели итп. Но к этому надо со временем привыкать просто :)

amel27 22-08-2010 16:55 1479398

Цитата:

Цитата semiono
глядя на запись byte[20] можно понять, что в скобках можно ещё и указать количество »

...а глядя на справку по DllStructGetData() можно понять, что у элемента (по порядковому номеру/имени в структуре) еще может быть и индекс - как раз для элементов-массивов типа byte[20] ;)


Время: 23:06.

Время: 23:06.
© OSzone.net 2001-