Термінова допомога студентам
Дипломи, курсові, реферати, контрольні...

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

РефератДопомога в написанніДізнатися вартістьмоєї роботи

Mutex — це скорочення від mutual exclusion (взаємне исколючение). Це найбільш традиційний підхід для середовища Win32. Взагалі мьютекс зазвичай використовують задля перебування копії програми, але цей об'єкт можна пристосувати й у цього. Мьютекс підтримується лише на рівні ОС та її специфіка така, що мьютекс з заданим ім'ям може належати лише додатку, або нікому. Після того, як програма створила… Читати ще >

Предотвращение запуску 2-x копій програми (реферат, курсова, диплом, контрольна)

Предотвращение запуску 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.

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

Для підготовки даної праці були використані матеріали із російського сайту internet.

Показати весь текст
Заповнити форму поточною роботою