Другие языки программирования и технологии

как запретить второй запуск программы (Делфи) Добрый день всем, как запретить второй запуск своей программы

Самый удобный способ через мютексы.
Вот так
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.
Александр Мочалов
Александр Мочалов
28 666
Лучший ответ
Для того чтобы не дать программе запуститься, если её копия уже работает выполните следующие дейтвия: выберите 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.
Тупой способ, годящийся для любого языка программирования. При запуске создается файл с какой-то информацией. Но сначала проверяется, имеется ли такой файл (или такая информация) , если имеется, то выход. Программа не запустится снова, пока такая информация существует; стереть ее или изменить можно через основную программу же. Если требуется блокировать лишь запуск второй копии, то стирание файла проводится перед окончанием основной ветви. Если требуется задержка исполнения на заданный срок - при запуске может проверяться время создания блокирующего файла, и если он стар - то стирается, далее создается свежий и программа идет обычным образом. Одним словом, масса возможностей. Недостаток - возможность пользователю стереть блокирующую информацию вручную; для борьбы с этим можно тоже предложить массу способов.

Более интересный способ - использование недокументированных "пустых" областей памяти. Не рекомендован для общего пользования из-за плохой переносимости между системами. Можно использовать "реестр", но здесь - та же проблема переносимости. Можно, наконец, вносить изменения в запускаемый файл, но это значительно проще делать на ассемблере или Си - и к тому же подобная конструкция может не понравиться антивирусным мониторам. Так что я за использование файла.