![]() |
BINARY - последовательность значений параметров в реестре.
Как красиво записать строку?
Код:
$x = Binary(0) & Binary(24) & Binary(@DesktopWidth) & Binary(@DesktopHeight-52) & Binary(0) Как-то так нельзя - BinaryString(0,24 & @DesktopWidth... итп...) ? |
Эта тема ждёт ответа, если глупый вопрос, то удалите тему. :)
Просто скрипт готов, и пора его кампильнуть. )) --- А вообще суперзадача, если бы старые данные не трогать, а только записать нужные байты с определённой позиции в строке! Это лучшее решение. Позицию в строке всегда можно указать явно, парсить и искать тут не нужно. Насколько я понял, там обычно всегда данные записанны кусками по четыре байта. То-есть в моём примере надо заменить @DesktopWidth в строке начиная с девятого байта строки. И сам @DesktopWidth тоже знимает 4 байта, только в перевёрнутом "форматированном" виде Binary() - 2048(десятичное) > 800(хекс) > 00 80 00 00(интелевское) :) |
Код:
$tReg = DllStructCreate("int;int Data;int Width;int Height;int") |
Кто нибудь пожалуйста можете прокоментировать, что это делает:
Код:
$tBin = DllStructCreate("byte["& DllStructGetSize($tReg) &"]", DllStructGetPtr($tReg)) |
semiono
Думаю понятно, что одну последовательность байтов (блок памяти) можно интепретировать по разному - как массив целых, рациональных или действительных чисел, либо как массив ANSI/UNICODE/... знаков (текстовая строка) или еще как... При создании структуры через DllStructCreate() мы как раз и задаем пособ кодирования набора байтов: "int;int Data;int Width;int Height;int" - последовательность из 5 целых чисел по 4 байта =20 байт, а три элемента структуры по ходу именуем для удобства обращения. Но при создании новой структуры мы можем указать на уже существующую структуру (последний параметр DllStructCreate()), в этом случае память под структуру не выделяется, мы лишь "перекодируем" данные первой структуры, в примере - как простую последовательность байтов - "byte[20]". Само собой, длина второй "виртуальной" структуры не должна превышать (в байтах) длину первой "реальной" структуры, иначе последствия могут быть печальными. В нашем случае структуры одинаковой длины (DllStructGetSize() как раз возвращает длину структуры в байтах), поэтому определять их можно в любом порядке: Код:
$tBin = DllStructCreate("byte[20]") |
Для меня в основном не понятно, то что по документации DllStructCreate() инициализируется так
(разрядность имя;разрядность имя;разрядность имя;разрядность имя) Хотя глядя на запись byte[20] можно понять, что в скобках можно ещё и указать количество, а само имя можно иногда опустить. Но ещё и указатель , DllStructGetPtr($tReg) ) ...вообщем из справки всего этого не понятно, всех возможных определений. Меня смутило не суперпозиция функций DllStructCreate(DllStructGetSize(), DllStructGetPtr()) а замена типов данных на указатели итп. Но к этому надо со временем привыкать просто :) |
Цитата:
|
Время: 23:06. |
Время: 23:06.
© OSzone.net 2001-