Buffer.CopyToSystemMemory

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

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

Синтаксис

Buffer.CopyToSystemMemory(<Указатель в системной памяти (INT)>,<Размер данных в байтах (INT)>,<Индекс в буфере для копирования (INT)>)

Аргументы

  • <Указатель в системной памяти (INT)> - Указатель адреса в системной памяти, куда будет происходить копирование.
  • <Размер данных в байтах (INT)> - (необязательный аргумент) Количество байт для копирования. Если аргумент опущен, будет скопирована информация до конца буфера.
  • <Индекс назначения копирования (INT)> - (необязательный аргумент) Позиция в буфере начала данных. Адресация буфера начинается с нуля.

Примеры

//Пример показывает работу функций адресации системной памяти

//Подготовка буфера, запись двух строк
аСтр:="Строка ";
бСтр:="проверки";
аБуф:=Buffer.Create();
аБуф.SetStringW(0,аСтр);
аБуф.SetStringW(Length(аСтр)*2,бСтр);

//Подготовка второго буфера
бБуф:=Buffer.Create();
бБуф.Fill(0,100,0);

//Получение системного адреса буфера второго буфера
аАдр:=бБуф.SystemAddress();

//Копирование информации в системную память (в данном случае, адрес указывает на второй буфер)
аБуф.CopyToSystemMemory(аАдр,Length(бСтр)*2,Length(аСтр)*2);
вСтр:=бБуф.GetStringW(0,Length(бСтр));

//Будет выведено "проверки"
Message(вСтр);