Известно, что Windows - многозадачная система. Это конечно хорошо. Но обратной стороной многозадачности является то, что одновременно можно запустить несколько копий одного и того же приложения. Пользователь может это сделать не специально, да и вторая копия приложения может запуститься из-за ошибки в программе или же самой OC. Из-за клона могут возникнуть некоторые проблемы, связанные с файловыми операциями, операциями с реестром и т.п. Поэтому код поиска и закрытия собственной копии в программе совсем не лишний. Есть несколько методов выполнения нахождения копии. В этой статье я их вам продемонстрирую.
Поиск главной формы (окна)
Чтобы найти копию главного окна можно воспользоваться функцией WinApi - FindWindow. В качестве параметра этой функции передается имя класса окна, которое использовалось при регистрации типа, определяющиего окно формы или в системе окон (WndClass) и заголовка окна. В Дельфи имя оконного класса WndClass совпадает с именем класса формы в Object Pascal (например TForm1). Функция возвращает 0, в случае если окна не существует, либо дескриптор окна, если окно существует. Основной код вашей программы должен быть написан так, что бы программа смогла запуститься, если результат функции FindWindow равен нулю или завершиться в обратном случае. Следующий пример, если вы собираетесь его использовать, нужно вставить в dpr-файл проекта (меню Project - View Source). Пример:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
HWnd : THanlde;
begin
HWnd := FindWindow ('TForm1', nil);
if HWnd <> 0 then
if not IsWindowVisible(HWnd) then
PostMessage(HWnd, wm_User, 0, 0);
SetForegroundWindow (HWnd)
else
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
//если в программе несколько форм, то создайте их здесь
//вручную, например Application.CreateForm(TForm2, Form2)
Application.Run;
end;
end.
Разъясню код по строчкам. В первых двух строках я объявил переменную HWnd типа THandle для хранения результата работы функции. Далее записываю результат выполнения функции FindWindow в переменную HWnd. Затем сравниваю результат: если он не равен нулю (т.е. программа уже запущена и данный экземпляр является копией) активизирую главную форму запущенного приложения. В обратном случае выполняю операции по инициализации, создания форм и запуска программы.
Однако при использовании этого кода могут возникнуть некоторые проблемы. Учтите, что если вы запустите программу в то время, когда работает дельфи с открытым в ней проектом запускаемого приложения, то программа вообще не запустится. Это связано с тем, что в системе уже существует форма с сответствующим классом в конструкторе дельфи. Однако вы сможете запустить программу, если закроете в дельфи файл юнита, связанного с формой, и саму форму (или лучше вообще весь проект). Если же вы просто закроете форму в конструкторе дельфи, то окно не уничтожится, а будет скрыто и так же будет существовать в системе. Поэтому встраивать этот код лучше на этапе завершения работы над программой.
Использование мьютексов
Mutex - это сокращение от mutual exclusion (взаимное исколючение). Это наиболее традиционный подход для среды Win32. Вообще мьютекс обычно используют не для нахождения копии программы, но этот объект можно приспособить и для этой цели. Мьютекс поддерживается на уровне ОС и его специфика такова, что мьютекс с заданным именем может принадлежать только одному приложению, либо никому. После того, как программа создала мьютекс, она может проверить, принадлежит ли этот объект какой либо программе. Для проверки используется функция WinApi - WaitForSingleObject. Если в момент обращения к этой функции мьютекс принадлежит кому либо, то функция ждет определенное количество времени (передается в качестве параметра) до освобождения мьютекса (если мьютекс не будет освобожден то функция возвратит ошибку с кодом wait_TimeOut). А если мьютекса не существует (т.е. основная программа не запущена), то программа становится владельцем мьютекса. Реализация такого подхода показана в следующем примере:
program Project1;
uses
Windows,
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
hMutex : THandle;
begin
hMutex := CreateMutex(nil, False, 'UniqueProgrammMutex');
if WaitForSingleObject(hMutex, 0) <> wait_TimeOut then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.
Этот метод является безусловно надежнее предыдущего. Единственный недостаток этого метода - это то, что при запуске копии программы главное окно запущенного приложения не активируется, хотя это легко можно исправить путем поиска главного окна в списке окон либо с помощью описанной функции FindWindow.
Другие работы по теме:
1. Введение в предмет
Целью курса является изучение принципов и освоение практических навыков параллельного программирования с использование технологии mpi
Производственный цикл выпуска детали типа Ось
1. Расчет годовой программы выпуска деталей Расчет годовой программы выпуска деталей проведем в соответствии с данными табл. 1. Таблица 1 Программа выпуска деталей типа «Ось» с максимальным диаметром 35 мм и длиной l = 100 мм
Производственный цикл выпуска детали типа "Ось"
Расчет годовой программы выпуска деталей типа "Ось". Расчет минимальной партии запуска деталей в производство, определение основного и штучного времени их обработки. Расчет штучно-калькуляционного времени. Определение длительности производственного цикла.
ХАТ - почтовая служба
Text Text Создание креативных (вирусных) роликов как для интернета, так и для телевидения. Создание креативных (вирусных) роликов как для интернета, так и для телевидения.
Стратегия выхода зарубежного бренда на Российский рынок
Тема практического задания: СТРАТЕГИЯ ВЫХОДА ЗАРУБЕЖНОГО БРЕНДА НА РОССИЙСКИЙ РЫНОК» Задание Разработать маркетинговую программу выхода одного из зарубежных брендов на российский рынок. Программу представить в виде презентации, краткое описание самого бренда, стратегических целей запуска бренда на российский рынок, конкурентный анализ +разработка стратегии продвижения бренда (план маркетинговых мероприятий по продвижению бренда с иллюстрациями рекламных материалов).
Кем был автор Слова о полку Игореве
Кем был автор "Слова о полку Игореве"? Автор: Древнерусская литература Копий как много по тебе сломали, «Слово…» ! Оратор не один слюною захлебнулся.
Скальные жилища Маниту
Скальные жилища Маниту — туристическая достопримечательность США и музей под открытым небом, расположенный к западу от Колорадо-Спрингс в штате Колорадо, США у федерального шоссе 24 в Маниту-Спрингс.
The Denver Post
Введение 1 История Список литературы The Denver Post Введение The Denver Post (русск. Дэнвэр пост) — популярная газета США. Подобно большинству американских газет, создана как региональное издание. Однако, концепция регионального СМИ не помешала ей стать одной из влиятельнейших газет стран. Тираж: 255 452 копий по будням[1] и воскресный выпуск 704 806 экземпляров[2].
Архитектура памяти Windows CE 6
Вкратце, новая модель памяти дает возможность для запуска практически неограниченного числа процессов и под каждый процесс выделяется 2Гб виртуальной памяти.
Рекурсия
Рекурсия — это такой способ организации вспомогательного алгоритма (подпрограммы), при котором эта подпрограмма (процедура или функция) в ходе выполнения ее операторов обращается сама к себе.
Автозагрузка в Windows XP
Существует немало способов автозагрузки программ. Ниже приведены несколько вариантов для ознакомления, возможно это поможет вам, если возникнет необходимость найти и удалить какую-либо программу из автозагрузки.
Создание splash-заставки
Думаю многие знают, что такое splash-картинка, но все же поясню: это картинка, которая предшествует запуску основной программы и обычно отображается во время загрузки программы
Команды Norton Commander
Кафедра проектирования дорог Лабораторная работа №1 по курсу «Информатика» Выполнил студент группы №114359 Райхман Сергей Юрьевич роверил Минск 1999
Basic
МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ЮБРАЗОВАНИЯ РФ ТАМБОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ КАФЕДРА ГАПС Курсовая работа по информатике
Основы устройства технических и экономических баз данных
Методика создания и апробации базы данных о складском запасе товара компании Дом-видео Пашино. Определение основных требований к данной системе в связи с выполняемыми ею функциями. Оценка эффективности базы данных, ее содержание и главное значение.
Системное программирование в операционных системах
Создание системы, осуществляющей запуск программы по расписанию, которое хранится в реестре. Методы и средства взаимодействия с аппаратными и программными средствами, типы интерфейсов. Алгоритм работы и листинг программы, проверка ее работоспособности.
Компьютерные вирусы 2 3
Text Что такое вирус? Что такое вирус? Группы вирусов? Каналы распространения? Признаки появления? Виды антивирусов? Graphics
Команды Norton Commander
ФТК Кафедра проектирования дорог Лабораторная работа №1 по курсу «Информатика» Выполнил студент группы №114359 Райхман Сергей Юрьевич роверил Минск 1999
Основные свойства проекта
Федеральное агентство по образованию ГОУВПО «Московский Государственный Текстильный Университет им. А. Н. Косыгина» Кафедра АСОИ и У Лабораторная работа №1
Настройка параметров приложения
Санкт-Петербургский Государственный Политехнический университет Лабораторная работа №1 санкт-петербург 2009 год Настройка параметров приложения
Отчет по программированию
Пензенский государственный университет Кафедра "Информационно-вычислительные системы" ЗАПИСИ Отчет о лабораторной работе №1 по дисциплине «Информатика и программирование».
Операционные системы 2 2
Text Text Graphics Операционные системы среды и оболочки Выполнила Гурьева Ольга группа ИС 73-1 Graphics
Специальные функции архиватора RAR
Специальные функции архиватора Доклад подготовила Комарова М.И. Институт иформационных технологий СЕГРИС 2004 г. 1. Работа с в полноэкранном режиме. Работа с файлами
Противопожарная безопасность
Пожарная безопасность. Общие сведения Пожарная безопасность - состояние объекта защиты, характеризуемое возможностью предотвращения возникновения и развития пожара, а также воздействия на людей и имущество опасных факторов пожара (источник: Федеральный закон 123-ФЗ "Технический регламент о требованиях пожарной безопасности").