![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Блокировка повторного запуска приложения
NY152 © (2002-01-29 14:03:00)Люди добрые, подскажите как проверить наличие копии программы в памяти чтобы исключить её повторный запуск ? В инете есть куски кода - но все они какие-то очень сложные, может кто пользуется чем-то уже давно, дайте процедурку =)
Заранее благодарен.
ПС: заранее прошу прощения, наверное уже были подобные вопросы, но я что-то не нашёл их, подскажите тогда ссылку =)
panov (2002-01-30 07:01:00) [21]>Johnmen © (29.01.02 16:24)
В чем не прав? Если не прав, то поправь:
Никакой гарантии.
Со времени старта программы до установки семафора проходит некоторое время. Согласен?
В это время успешно может стартовать та же самая программа.
Может быть, с этим не согласен?
Raptor (2002-01-29 22:02:00) [22]Уже в который раз поднимается этот вопрос, и всегда по нему много споров. :-))
Приведу адрес очень хорошей и полной статьи посвященной этой проблеме. Всем, кого это интересует, советую прочитать ее и тогда все вопросы будут сняты.
http://www3.pgh.net/~newcomer/nomultiples.htm- оригинал.
http://www.rsdn.ru/article/?baseserv/avins.xml- перевод.
amamed_3071 (2002-01-29 16:58:00) [23]В Source пройекта прибав....
Var x:Hwnd;
Begin
Application.Initialize;
Application.Title:="TMPTitle";
x:=Findwindow(nil,"Application Title");
if x<>0 then
Begin
ShowWindow(x,SHOW_OPENWINDOW);
SetForegroundWindow(X);
Halt;
End;
Application.Title := "Application Title";
Application.CreateForm..
....
End.
Johnmen (2002-01-29 16:24:00) [24]>>>panov © ты неправ, система семафоров однозначно определяет, запущен ли процесс...
>>>NY152 : самое простое и надежное :
// second instance ?
SetLastError(0);
CreateSemaphore(nil,0,1,"YourSemaphoreName");
if GetLastError<>0 then begin;
MessageDlg("ПРОГРАММА УЖЕ ЗАПУЩЕНА !",mtError,[mbOk],0);
Halt(1);
end;
где YourSemaphoreName уникальное имя твоего семафора...
panov (2002-01-29 15:29:00) [25]Эта тема неоднократно обсуждалась. Практически ни один метод не дает 100% гарантии...
erik (2002-01-29 15:18:00) [26]Я использую GlobalAtom мне кажнтся так проще и ресурсрв меньше идет.
panov (2002-01-29 14:42:00) [27]А еще проще FAQ посмотреть, и статьи почитать...
Valentin2 (2002-01-29 14:38:00) [28]program Project1;
uses
Forms,Windows,
Unit1 in "Unit1.pas" {Form1};
const NamedMutex="OneOnly";
var
MT:Integer;
function CheckInstance(Name:PChar):Integer ;
var
r:integer;
Mutex:Integer;
begin
Mutex:=CreateMutex(nil,true,Name);
r:=GetLastError();
if (r<>0)
then Result:=0
else Result:=Mutex;
end;
{$R *.RES}
begin
MT:=CheckInstance(NamedMutex);
if (MT=0) then
begin
MessageBox(0,"Приложение уже запущено","Ошибка",0);
exit;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
serg001 (2002-01-29 14:22:00) [29]Вот главная прога:
programtvojaprogramma;
usesthefirst...
...
Вот юнит thefirst:
unit thefirst;
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;
initialization
if StopLoading then halt;
finalization
if Mutex <> 0 then
CloseHandle(Mutex);
end.
Бильврёст (2002-01-29 14:21:00) [30]Это очень просто реализуется с помощью мьютексов - посмотрите help - там всё очень доступно.