Форум: "Система";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
ВнизКак запретить запуск еще одного экземпляра того же приложения? Найти похожие ветки
← →
harismatik (2002-10-29 14:30) [0]Смотри тему.
← →
MBo (2002-10-29 14:32) [1]смотри FAQ.
← →
Lony (2002-10-29 14:56) [2]{ **** UBPFD *********** by delphibase.endimus.com ****
>> Запуск одной копии приложения (Mutex-базированный)
Единственная функция Init_Mutex этого модуля (only_one.pas) создает мьютекс с именем, переданным в параметре mid.
Возврат: true, если мьютекс создан (запущен первый экземпляр приложения) или false, если уже имеется мьютекс с подобным именем (mid).
Особенности:
1. даже при "гибели" приложения все, относящиеся к нему мьютексы удаляются с большой степенью вероятности.
2. Желательно "отметить" приложение в системе так, как указано в примере. При таком подходе Ваше приложение почти со стапроцентной вероятностью не будет запущено два раза.
Зависимости: Windows
Автор: Роман Василенко, romix@nm.ru, Пятигорск
Copyright: Роман Василенко
Дата: 14 июня 2002 г.
***************************************************** }
unit Only_One;
interface
function Init_Mutex(mid:string):boolean;
implementation
uses Windows;
var
mut:thandle;
function mut_id(s:string):string;
var
f:integer;
begin
result:=s;
for f:=1 to length(s) do
if result[f]="\" then result[f]:="_";
end;
function Init_Mutex(mid:string):boolean;
begin
Mut := CreateMutex(nil,false,pchar(mut_id(mid)));
Result := not ((Mut = 0) or (GetLastError = ERROR_ALREADY_EXISTS));
end;
initialization
mut:=0;
finalization
if mut<>0 then CloseHandle(mut);
end.
Я применяю это следующим образом:
program MyProgram;
uses
only_one,
Unit1 in "Unit1.pas" {Form1},
Unit2 in "Unit2.pas" {dm: TDataModule},
Unit3 in "Unit3.pas" {Form3},
{$R *.RES}
const
UniqueString="MyProgramMutex"; {Может быть любое слово. Желательно латинскими буквами.}
begin
if not init_mutex(UniqueString) then exit; {Выходим до инициализации, если мьютекс уже есть}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(Tdm, dm);
Application.CreateForm(TForm3, Form3);
Application.Run;
end.
Источник - http://delphibase.endimus.com/?action=viewfunc&topic=appctrl&id=10227
← →
DimaK (2002-11-16 22:10) [3]var Wnd: hWnd;
Buff: array [0..127] of Char;
begin
Wnd:=GetWindow(Handle, gw_HWndFirst);
while Wnd <> 0 do
begin
if (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner)=0) then
begin
GetWindowText(Wnd, buff, sizeof(buff));
if StrPas(buff)=Application.Title then
begin
MessageDlg("Программа уже загружена. Повторный запуск программы невозможен!", mtWarning, [mbOk], 0);
Halt;
end;
end;
Wnd:=GetWindow(Wnd, gw_hWndNext);
end;
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c