Использование файлов в памяти




Дневник №16 (1 апреля): Один из самых частых вопросов о Delphi — как написать приложение, существование которого в системе ограничивается одним экземпляром. За последний год я обнаружил несколько решений этой задачи. Одно из них оказалось таким интересным, что я решил описать его здесь.

Чтобы приложение могло обнаружить факт существования другого своего экземпляра, оно должно как-то обратиться c запросом к системным данным. В Windows 3.1 приложение могло узнать о существовании предыдущего экземпляра по значению hPrevInst, однако в Windows 95 все изменилось.

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

Для обмена информацией между приложениями обычно применяется

уникальный глобальный ключ, доступный для всех экземпляров программы. Классический пример — использование уникального файла. При запуске

приложение проверяет, существует ли файл с заданным именем (например, FOOBAR99.DAT). Если такой файл существует, значит, в настоящее время уже работает другой экземпляр программы. Если файл не найден, новый экземпляр программы создает его. Завершая свою работу, программа удаляет файл.

Одна из проблем подобного подхода связана с возможными аномалиями (например, «зависанием» системы или сбоем питания). Поскольку «флаг» (в данном случае — файл) хранится на постоянном носителе, он сохранится и после перезагрузки. В этом случае первый запущенный экземпляр программы «увидит» файл, решит, что в системе уже работает другой экземпляр, и немедленно завершится. В итоге программа вообще перестанет работать. Вам придется наводить порядок, удалять файл и возвращать систему к нормальному состоянию.
Win95 предоставляет более приятную альтернативу — общие файлы в памяти. При этом файл представляет собой временную область памяти (или по крайней мере трактуется как область памяти, даже если он временно выгружается на диск). В отличие от многих ресурсов Win95 файлы в памяти могут совместно использоваться несколькими процессами.

Я создал простейшее приложение для проверки теории о том, что файлы в памяти могут применяться для поиска других экземпляров программы.

На Рисунок 16.3 изображено рабочее окно приложения, а в листинге 16.3 приведен его исходный текст.



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