MemoryRecord.SystemAddress

From SunFlurry wiki
Revision as of 18:18, 8 June 2020 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  SystemAddress (Информация по записи)
Объект:Запись
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в число, строку, неверный индекс, неверное имя поля.
Визуальность:Нет

Функция возвращает системный указатель на указанное имя поля (для полей-массивов также можно указать индекс массива). Запись должна быть привязана. В отличие от функции Index, указатель может быть получен для вложенных записей без какого-либо дополнительного вычисления. Внимание: использование системных указателей опасно, запись или чтение может вызвать системное исключение доступа, если адрес недоступен или память не выделена.

Синтаксис

MemoryRecord.SystemAddress(<Наименование поля (STRING)>,<Индекс массива (INT)>=0):<Системный адрес к данным поля (INT)>

Аргументы

  • <Наименование поля (STRING)> - (необязательный аргумент) Задает наименование поля записи, системный адрес для которого необходимо найти. Наименование задается без учета регистра. Если наименование не задано, функция возвращает смещение на начало записи (первое поле записи).
  • <Индекс массива (INT)> - (необязательный аргумент) Если поле является массивом, аргумент может указывать на индекс массива, смешения для которого необходимо найти. Первый элемент массива имеет индекс 0. По умолчанию, смешение будет найдено для первого элемента массива.

Возвращаемое значение

Возвращается числовое значение.

Примеры

//Заполнение буфера
aBuf:=Buffer.Create(4096);
aBuf.Fill(0,4096,0);
//Байт с позицией 3 равен 132.
aBuf[3]:=132;
//Адрес буфера в системной памяти
aMem:=aBuf.SystemAddress();

//Создание записи
rRec:=MemoryRecord.Create("Value:A6:UI8");
//Создание второй записи с ссылкой на первую
rRec2:=MemoryRecord.Create("V1:UI32,Value:^@rRec");
//Выделение памяти под запись
bBuf:=rRec2.Allocate();
//Запись адреса памяти в начало записи (работает как для x86, так и для x64)
If PointerSize()=4 Then
  bBuf.SetDWord(4,aMem);
Else
  bBuf.SetQWord(4,aMem);
EndIf;

//Системный указатель на элемент массива rRec2.Value.Value[3]
aMem:=rRec2.Value.SystemAddress("Value",3);
rRec3:=MemoryRecord.Create("data:UI8");
rRec3.AssignToSystemMemory(aMem);

//Будет выведено число 132
Message(rRec3.data);