Главная    Почта    Новости    Каталог    Одноклассники    Погода    Работа    Игры     Рефераты     Карты
  
по Казнету new!
по каталогу
в рефератах

Программирование на Delphi

ными в применении, вы можете  использовать  компонент
TPowersock,  разработанный  компанией  NetMasters.  Он  находится  также  на
странице Internet Панели инструментов.
Совместное использование общей памяти
Традиционным  является  метод   межзадачного   взаимодействия   при   помощи
совместно используемой памяти. В DOS и 16-разрядной Windows он  был  простым
и не требующим пояснений  —  у  всех  задач,  в  том  числе  у  операционной
системы, было общее адресное пространство. Но именно  из  этого  проистекали
все беды и проблемы данных ОС. В 32x разрядных  версиях  Windows  у  каждого
приложения свое адресное пространство, недоступное другим  приложениям.  Тем
не менее, способ обмена данными через память существует.
Разделение данных осуществляется посредством отображения  некоторого  объема
совместно используемой памяти в адресное  пространство  каждого  приложения,
участвующего в  обмене.  Память  может  быть  разделяемой  потому,  что  она
фактически  располагается  вне  адресного  пространства  приложения.  Вообще
говоря, в 32-разрядной  Windows  под  "памятью"  подразумевается  не  только
оперативная память (ОЗУ), но  также  и  память,  резервируемая  операционной
системой на жестком диске. Этот вид памяти называется  виртуальной  памятью.
Код и данные отображаются на жесткий  диск  посредством  страничной  системы
(paging system) подкачки.  Страничная  система  использует  для  отображения
страничный файл (win386.swp в Windows  95  и  pagefile.sys  в  Windows  NT).
Необходимый фрагмент виртуальной памяти переносится из страничного  файла  в
ОЗУ и, таким образом, становится доступным.
Для выделения фрагмента совместно используемой  памяти  должен  быть  создан
специальный системный объект Win 32, называемый  отображаемым  файлом.  Этот
объект  "знает",  как  соотнести  файл,  находящийся  на  жестком  диске,  с
памятью, адресуемой процессами. В нашем случае файл, который мы  посредством
объекта файлового отображения хотим сделать доступным  нашему  приложению  —
это не файл с расширением ТХТ, DLL. или ЕХЕ. Это страничный  файл  подкачки,
используемый  системой.  Отобразив  фрагмент  страничного  файла  в  память,
адресуемую нашим приложением, мы, по сути дела,  получили  фрагмент  памяти,
на который в дальнейшем будем ссылаться, как  на  данные  объекта  файлового
отображения.
Примечание.  Объекты  файлового   отображения   могут   использоваться   для
отображения  в  память  любого  файла,  а  не   только   страничного   файла
операционной системы.
Одно или более приложений могут открыть отображаемый  файл  и  получить  тем
самым доступ к данным этого объекта. Таким  образом,  данные,  помещенные  в
страничный файл приложением, использующим отображаемый файл, будут  доступны
другим приложениям, если они открыли и используют тот же самый  отображаемый
файл.
Разделение   данных   между    приложениями    осуществляется    посредством
использования  функций  API,  предоставляемых  Win   32   для   создания   и
использования объектов файлового отображения. Вот наиболее  важные  из  этих
функций:


CreateFileMapping

MapViewOfFile

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


function CreateFileMapping (hFile: THandle;

ipFileMappingAttributes: PSecurityAttributes;

flProtect,

dwMaximumSizeHign,

dwMaximurnSizeLow: DWORD;

lpName: PChar): THandle; stdcall;
Первый параметр имеет тип THandle. Для наших целей значение этого  параметра
всегда должно быть $FFFFFFFF (значок  "$"  указывает  на  то,  что  значение
шестнадцатеричное). В принципе на этом месте должен  стоять  дескриптор  уже
открытого при помощи функции CreateFile файла; но, поскольку мы  имеем  дело
с необычным  файлом,  указание  значения  $FFFFFFFF  приводит  к  связыванию
объекта файлового  отображения  именно  со  страничным  файлом  операционной
системы.
Второй параметр — указатель на  запись  типа  TSecurityAttributes.  В  нашем
случае значение этого параметра всегда равно nil. Третий параметр имеет  тип
dword. Он определяет атрибут защиты. Чтобы при  помощи  отображаемого  файла
организовать совместное использование  данных,  третьему  параметру  следует
присвоить значение PAGE_READWRITE.
Четвертый  и  пятый  параметры  также  имеют  тип  dword.   В   32-разрядной
операционной системе значение dword имеет дайну 32 бита.  Когда  выполняется
функция  CreateFileMapping,  значение  типа   dword   четвертого   параметра
сдвигается влево на четыре байта и затем объединяется  со  значением  пятого
параметра посредством операции and. Проще говоря,  значения  объединяются  в
одно 64-разрядное число, равное объему памяти, выделяемой объекту  файлового
отображения из страничного файла операционной системы.
Поскольку вы вряд ли попытаетесь осуществить  выделение  более  чем  четырех
гигабайт данных, то значение четвертого параметра всегда должно  быть  равно
нулю. Используемый затем пятый параметр должен показывать, сколько памяти  в
байтах необходимо зарезервировать в качестве совместной.
Шестой параметр  имеет  тип  pСhar.  Это  значение  представляет  собой  имя
объекта файлового отображения, которое должно быть уникальным.
Функция  СreateFileMapping  возвращает  значение  типа  THandle.  В   случае
успешного  завершения  возвращаемое  функцией  значение  представляет  собой
дескриптор созданного объекта файлового отображения. В случае  возникновения
какой-либо ошибки возвращаемое значение будет равно 0.
Следующий    фрагмент    кода    демонстрирует     использование     функции
СreateFileMapping:


var

hMappedFiie: THandie;

Begin

hMappedFile:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,

25, 'SharedBiock');

if (hMappedFiie = 0) then ShowMessage('Mapping error ! ');

End;
В этом примере функция выделяет 25  байт.  езультирующий  отображаемый  файл
называется SharedBlock. В случае успеха функция  вернет  описатель  текущего
объекта  файлового  отображения   в   переменную   hFileMapObj.   Переменная
hFileMapObj имеет тип THandie. Если переменная hFileMapObj  равна  нулю,  то
это значит,  что  функция  завершилась  с  ошибкой,  о  чем  будет  выведено
соответствующее сообщение.
Подключение объекта файлового отображения к адресному пространству
При  помощи  функции  CreateFileMapping  мы  только  создали   объект   типа
"отображаемый  файл";  следующая  задача  —  спроецировать  данные  файла  в
адресное  пространство   нашего   процесса.   Этой   цели   служит   функция
MapViewOfFile. Функция MapViewOfFile имеет пять параметров:


function MapViewOfFile(hFileMappingObject: THandie;

dwDesiredAccess: DWORD;

dwFileOffsetHigh,

dwFiieOffsetLow,

dwIMumberOfBytesToMap: DWORD): Pointer; stdcall;
Первый параметр имеет тип THandle.  Его  значением  должен  быть  дескриптор
созданного объекта файлового отображения — тот, который  возвращает  функция
CreateFileMapping. Второй параметр имеет  тип  dword.  Его  значение  должно
быть   установлено   в   FILE_MAP_WRITE   (или.   что   то   же   самое,   в
FILE_MAP_ALL_ACCESS);   это   означает,   что   данные   объекта   файлового
отображения будут доступны как по считыванию, так и по записи.
Третий  и  четвертый  параметры  также  имеют  тип  dword.  Это  —  смещение
отображаемого участка относительно начала файла в  байтах.  В  нашем  случае
эти параметры должны быть установлены в нуль,  поскольку  значение,  которое
мы даем пятому (последнему) параметру  функции  MapViewOfFile,  также  равно
нулю.
Пятый  и  последний  параметр  функции  MapViewOfFile,  как   и   предыдущие
параметры, имеет тип dword.  Он  используется  для  определения  (в  байтах)
количества данных объекта файлового отображения, которые надо  отобразить  в
процесс (сделать  доступными  для  вас).  Для  достижения  наших  целей  это
значение  должно  быть  установлено  в  нуль,  что  означает  автоматическое
отображение  в  процесс  всех  данных,  выделенных   перед   этим   функцией
CreateFileMapping.
Значение, возвращаемое функцией MapViewOfFile, имеет тип  "указатель".  Если
функция отработала успешно, то она вернет  начальный  адрес  данных  объекта
файлового отображения.
Следующий фрагмент кода демонстрирует вызов функции MapViewOfFile:


var

hMappedFile: THandie;

pSharedBuf: PChar;

Begin

hMappedFile:=CreateFileMapping ($FFFFFFFF, nil, PAGE_READWRITE, 0,

25, 'SharedBlock');

if (hMappedFile = 0) then ShowMessage ('Mapping error !') else begin

pSharedBuf:=MapViewOfFile(hMappedFile,FILE_MAP_ALL_ACCESS,0,0,0);

if (pSharedBuf = nil) then ShowMessage ('MapView error');

end;

End;
В этом примере выделяется 25 байт  разделяемой  памяти  при  помощи  функции
CreateFileMapping. Имя результирующего объекта файлового  отображения  будет
SharedBlock.  Если  функция  завершится  успешно,   то   ссылка   на   новый
отображаемый файл будет  возвращена  в  переменную  hMappedFile.  Переменная
hMappedFile имеет тип Thandle, если значение  переменной  hMappedFile  равно
нулю, то это означает,  что  функция  отработала  с  ошибкой,  о  че
Пред.11121314
скачать работу

Программирование на Delphi

 

Отправка СМС бесплатно

На правах рекламы


ZERO.kz
 
Модератор сайта RESURS.KZ