Delphi 3. Библиотека программиста

       

Перед началом


Похоже, многие программисты даже не знают, что в файл проекта можно поместить код, который будет выполняться еще до инициализации приложения. Именно это и происходит в данном случае. Файл проекта для эксперименталь ного приложения приведен в листинге16.4.

Листинг 16.4. Файл проекта для программы, запускаемой лишь

в одном экземпляре

{——————————————————————————————————————————————————————} { Демонстрационная программа, } { запускаемая лишь в одном экземпляре. } { ONEINST.DPR : Файл проекта } { Автор: Эйс Брейкпойнт, N.T.P. } { При содействии Дона Тейлора } { } { Программа показывает, как предотвратить запуск } { нескольких экземпляров приложения в среде Windows 95.} { } { Написано для *High Performance Delphi 3 Programming* } { Copyright (c) 1997 The Coriolis Group, Inc. } { Дата последней редакции 30/4/97 } {—————————————————————————————————————————————————————— program OneInst; uses Windows, Forms, InstMain in 'InstMain.pas' {Form1}; const MemFileSize = 1024; MemFileName = 'one_inst_demo_memfile'; var MemHnd : HWND; {$R *.RES} begin { Попытаемся создать файл в памяти } MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, MemFileSize, MemFileName); { Если файл не существовал ранее, запускаем приложение... } if GetLastError <> ERROR_ALREADY_EXISTS then begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; CloseHandle(MemHnd);

end.

Дело обстоит так: прежде всего я пытаюсь создать объект отображения файла, вызывая функцию API CreateFileMapping. Независимо от того, существо вал объект ранее или был создан при вызове функции, его логический номер возвращается и присваивается MemHnd. При вызове CreateFileMapping с логическим номером $FFFFFFFF вместо традиционной файловой системы использует ся страничный файл (paging file) операционной системы, поэтому файл может совместно использоваться несколькими процессами; все процессы должны лишь знать имя файла. Хотя файл подготавливается для чтения/записи,

в программу не включен вызов функции MapViewOfFile, с помощью которой программа получает доступ к содержимому файла через указатель. В данном примере достаточно проверить, существует ли файл.

Если в момент вызова CreateFileMapping файл в памяти уже существовал, вызывающая процедура получает его логический номер, а системе возвращается код ошибки ERROR_ALREADY_EXISTS. Если функция GetLastError не находит эту ошибку, значит, предыдущего экземпляра не существует и работу можно продолжать.
Поскольку логический номер возвращается в любом случае (независимо от того, был создан файл или нет), его необходимо закрыть перед завершением приложения. Объект файла в памяти создается первой программой, вызывающей CreateFileMapping; когда логический номер будет закрыт последней программой, система уничтожит объект. Это равносильно удалению файла.

Конец записи (1 апреля).

Эйс нажал кнопку Print, и лазерный принтер ожил, выдав четыре страницы текста. Эйс достал их из лотка и внимательно просмотрел.

— Теперь все ясно, — решительно сказал он.

Хелен хотела напомнить о том, что она с самого начала была права, но вовремя передумала. Кроме того, Эйс уже направлялся к двери.

— Я пойду с тобой, — сказала она и взяла плащ с сумочкой.

— Прости, бэби, — ответил Эйс. — Там может быть опасно, так что ты останешься здесь. Подожди у телефона на случай, если что-нибудь сорвется.

— Наверное, ты прав, — неохотно признала она. — Но будь осторожен, милый.

И Хелен нежно поцеловала его.

— Я вернусь через час или два, — произнес Эйс. — А если не вернусь, вызывай полицию. Скажи им, что я отправился за Бохакером!

Еще один поцелуй, и он вышел.



Содержание раздела