Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск приложения один раз [D7, XP]


ilifant ©   (2006-04-17 20:00:00) 

Вопрос простой - как сделать чтобы приложение одновременно можно было хапустить один раз.


Wood   (2006-04-19 03:34:00) [1]

Этот пример я нашел здесь, на "Мастера Delphi"

program MyProgram;
uses
 OneHinst;  
 Windows,
 Forms,
 MyUnit in 'MyUnit.pas' {Form1};

{$R *.RES}

begin
   Application.Initialize;  
   Application.CreateForm(TForm1, Form1);
   Application.Run;
end.

unit OneHinst;
interface

implementation
uses
 Windows;
var
 Mutex : THandle;
 MutexName : array[0..255] of Char;

function StopLoading : boolean;
var
 L,I : integer;
begin
 // В качестве уникального имени мьютекса используем полный путь
 // к исполняемому файлу приложения
 L := GetModuleFileName(MainInstance,MutexName,SizeOf(MutexName));
 // В имени мьютекса нельзя использовать обратные слэши, поэтому
 // заменяем их на прямые
 for I := 0 to L - 1 do
   if MutexName[I] = '\' then
   begin
     MutexName[I] := '/';
   end;
 Mutex := CreateMutex(nil,false,MutexName);

 Result := (Mutex = 0) or // Если мьютекс не удалось создать
 (GetLastError = ERROR_ALREADY_EXISTS); // Если мьютекс уже существует
end;

procedure ShowErrMsg;
const
 PROGRAM_ALREADY_RUN = 'Невозможно запустить программу';
begin
 MessageBox(0,PROGRAM_ALREADY_RUN,MutexName, MB_ICONSTOP or MB_OK);
end;

initialization
 if StopLoading then
 begin
   ShowErrMsg;
   // Так как никаких инициализаций еще не производилось, то
   // спокойно используем для завершения программы Halt -
   // finalization все равно выполнится
   halt;
 end;
finalization
 if Mutex 0 then
   CloseHandle(Mutex);
end.


обсуждения были здесь:
http://www.delphimaster.ru/cgi-bin/forum.pl?look=1&id=1000482255&n=0
только сылка не работает.


Wood   (2006-04-18 15:21:00) [2]

надо еще этот пример найти...


Asail   (2006-04-18 12:31:00) [3]


> а если из файл-менеджера, то запускается.
> Было у кого такое же?

У меня все нормально с мутексами было. Покажи, как используешь?


RDen   (2006-04-18 07:03:00) [4]

> Rial

а если caption поменяется во время работы приложения?


Wood   (2006-04-18 04:10:00) [5]


> я использую с мьютексами
>

я тоже пробовал использовать мьютексы (нашел пример в в FAQ), но что характерно, если приложение запускается с ярлыка, напр., на рабочем столе, то повторную копию не запустишь, а если из файл-менеджера, то запускается.
Было у кого такое же?


Desdechado   (2006-04-17 20:12:00) [6]

в FAQ есть несколько разных решений
я использую с мьютексами


Rial   (2006-04-17 20:06:00) [7]

//caption='startcaption';

const finalcaption='mycaption';

tform1.create(...);
begin
if (findwindow('form1','startcaption')<>0)then begin
showmessage('Уже есть одно!');
Exit;
end;
caption:=finalcaption;
end;

Извини за удобочитаемость


Наверх

Титульная страница Поиск, карта сайта Написать письмо