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

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

Блокировка повторного запуска приложения


Страницы:   1 2

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]

Вот главная прога:

program tvojaprogramma;

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 - там всё очень доступно.


Страницы:   1 2

Наверх

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