Самый удобный способ через мютексы.
Вот так
program Project1;
uses
Forms,
windows,
main in 'main.pas' {Form1},
{$R *.res}
var
HM: THandle;
function Check: boolean;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'Сканер - Proximus');
Result := (HM <> 0);
if HM = 0 then
HM := CreateMutex(nil, false, 'Main');
end;
begin
if Check then
Exit;
Application.Initialize;
Application.ShowMainForm := False;
Application.CreateForm(TForm1, Form1);
Application.Title := 'Main';// Вместо Main вводим название главного окна программы
Application.Run;
end.
Другие языки программирования и технологии
как запретить второй запуск программы (Делфи) Добрый день всем, как запретить второй запуск своей программы
Для того чтобы не дать программе запуститься, если её копия уже работает выполните следующие дейтвия: выберите Project -> View Source. Появится окно редактора кода с открытым файлом Project.dpr (по умолчанию) . Далее добавьте в список модулей модуль Windows. А между Begin и End напишите:
CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, 1024,
'Programm Name');
if GetLastError <> ERROR_ALREADY_EXISTS then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
Application.MessageBox('Программа уже выполняется! ', 'Внимание');
halt;
end;
Теперь при попытке запустить вторую копию программы программа выдаст соответствующее сообщения и завершит работу.
Функция GetLastError - Выдаёт код ошибки последнего неудачного Windows API вызова;
Функция CreateFileMapping создает или открывает именованный или безымянный объект отображенного в памяти (проецируемого) файла для заданного файла.
В итоге получится следующее:
program Project1;
uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, 1024,
'Programm Name');
if GetLastError <> ERROR_ALREADY_EXISTS then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
Application.MessageBox('Программа уже выполняется! ', 'Внимание');
halt;
end;
end.
CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, 1024,
'Programm Name');
if GetLastError <> ERROR_ALREADY_EXISTS then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
Application.MessageBox('Программа уже выполняется! ', 'Внимание');
halt;
end;
Теперь при попытке запустить вторую копию программы программа выдаст соответствующее сообщения и завершит работу.
Функция GetLastError - Выдаёт код ошибки последнего неудачного Windows API вызова;
Функция CreateFileMapping создает или открывает именованный или безымянный объект отображенного в памяти (проецируемого) файла для заданного файла.
В итоге получится следующее:
program Project1;
uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, 1024,
'Programm Name');
if GetLastError <> ERROR_ALREADY_EXISTS then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
Application.MessageBox('Программа уже выполняется! ', 'Внимание');
halt;
end;
end.
Тупой способ, годящийся для любого языка программирования. При запуске создается файл с какой-то информацией. Но сначала проверяется, имеется ли такой файл (или такая информация) , если имеется, то выход. Программа не запустится снова, пока такая информация существует; стереть ее или изменить можно через основную программу же. Если требуется блокировать лишь запуск второй копии, то стирание файла проводится перед окончанием основной ветви. Если требуется задержка исполнения на заданный срок - при запуске может проверяться время создания блокирующего файла, и если он стар - то стирается, далее создается свежий и программа идет обычным образом. Одним словом, масса возможностей. Недостаток - возможность пользователю стереть блокирующую информацию вручную; для борьбы с этим можно тоже предложить массу способов.
Более интересный способ - использование недокументированных "пустых" областей памяти. Не рекомендован для общего пользования из-за плохой переносимости между системами. Можно использовать "реестр", но здесь - та же проблема переносимости. Можно, наконец, вносить изменения в запускаемый файл, но это значительно проще делать на ассемблере или Си - и к тому же подобная конструкция может не понравиться антивирусным мониторам. Так что я за использование файла.
Более интересный способ - использование недокументированных "пустых" областей памяти. Не рекомендован для общего пользования из-за плохой переносимости между системами. Можно использовать "реестр", но здесь - та же проблема переносимости. Можно, наконец, вносить изменения в запускаемый файл, но это значительно проще делать на ассемблере или Си - и к тому же подобная конструкция может не понравиться антивирусным мониторам. Так что я за использование файла.
Похожие вопросы
- Как запретить второй запуск программы?
- Скажите сколько месяцев нужно изучать Делфи что бы написать программу вывода даты, дня недели и года в окно ?
- Отслеживаем запуск программы...?(Vb. net )
- C#, запуск второй копии программы
- Быстрый запуск программы от имени другого пользователя Windows 7
- Как с помощью реестра запретить выполнение определенных программ?
- Всем привет! программа Делфи
- Надо написать код в программе делфи
- Запуск ассемблерных программ на "чистом" компьютере.
- Чем отличаются ОС в запуске программ? Например Windows, Linux и др. Конкретней вопрос внутри.