75410-1 (Предотвращение запуска 2-x копий программы)

2016-07-31СтудИзба

Описание файла

Документ из архива "Предотвращение запуска 2-x копий программы", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "75410-1"

Текст из документа "75410-1"

Предотвращение запуска 2-x копий программы

Известно, что 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.

Список литературы

Для подготовки данной работы были использованы материалы с сайта http://www.soch.imperium.by

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5173
Авторов
на СтудИзбе
437
Средний доход
с одного платного файла
Обучение Подробнее