Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

повторный запуск   Найти похожие ветки 

 
urri   (2005-05-20 20:51) [0]

Здравствуйте! Помогите пожалуйста с проблемой... "Как в исключить повторный запуск приложения" Заранее благодарен!


 
Eraser ©   (2005-05-20 20:58) [1]

urri   (20.05.05 20:51)

При помощи именованного мьютекса.


 
begin...end ©   (2005-05-20 21:02) [2]

Исключить повторный запуск только средствами Delphi вряд ли возможно.
А вот проверить при запуске, не была ли запущена уже Ваша программа (и, если это так, то завершить работу её копии), можно.
Как -- сказали в [1]. Примеры есть в Сети.


 
urri ©   (2005-05-20 21:10) [3]

как проверить при запуске, не была ли запущена уже наша программа (и, если это так, то завершить работу её копии)? :)


 
Eraser ©   (2005-05-20 21:17) [4]

urri ©   (20.05.05 21:10) [3]

В .dpr файле впиши перед Application.Initialize;

   CreateMutex(nil, True, "MySuperProject!!!!!!!!!!!");
   if GetLastError = ERROR_ALREADY_EXISTS then
   begin
     MessageBox(0, PChar("Already EXISTS!"), "My super proga!!!", MB_ICONERROR);
     Halt;
   end;


 
urri ©   (2005-05-21 12:42) [5]

Выдаёт следующую ошибку:
[Error] Project1.dpr(13): Undeclared identifier: "CreateMutex"
[Error] Project1.dpr(14): Undeclared identifier: "ERROR_ALREADY_EXISTS"
[Error] Project1.dpr(16): Undeclared identifier: "MessageBox"
[Error] Project1.dpr(16): Undeclared identifier: "MB_ICONERROR"


 
urri ©   (2005-05-21 12:42) [6]

Выдаёт следующую ошибку:
[Error] Project1.dpr(13): Undeclared identifier: "CreateMutex"
[Error] Project1.dpr(14): Undeclared identifier: "ERROR_ALREADY_EXISTS"
[Error] Project1.dpr(16): Undeclared identifier: "MessageBox"
[Error] Project1.dpr(16): Undeclared identifier: "MB_ICONERROR"


 
Marser ©   (2005-05-21 12:48) [7]


> urri ©   (21.05.05 12:42) [6]

Uses Windows, Messages


 
ATarget ©   (2005-05-21 17:13) [8]

А я так делаю:

program Project1;

uses
 Forms,windows,
 Unit1 in "Unit1.pas" {Form1};

{$R *.res}

begin
 if findwindow(nil,"Очень интересный заголовок моей главной формы") <> 0 then halt;
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.


При компиляции по F9 программа закроется так как в конструкторе уже есть окно с таким заголовком, но если прэкт закрыт всё рулит. Скажете: "неудобно" - отвечу "зато просто" да и строки эти я добавляю когда всё работает и писать ничего уже не надо.


 
ATarget ©   (2005-05-21 17:16) [9]

Да и ещё в Uses надо дописать Windows


 
GrayFace ©   (2005-05-21 17:46) [10]

ATarget ©   (21.05.05 17:13) [8]
А что здесь сложного:
if (CreateMutex(nil, True, "MySuperProject!!!!!!!!!!!")=0) or (GetLastError = ERROR_ALREADY_EXISTS) then halt;


 
petya-kurochkin ©   (2005-05-21 18:21) [11]

Кстати, а если у меня много оконное приложение, то что мне делать, как мне искать не окно, а проект с таким же именем?


 
Floppy ©   (2005-05-21 20:33) [12]

В dpr после
Application.Initialize;
добавить
if FirstHinstanceRunning(0) then Exit;


 
Kerk ©   (2005-05-21 20:35) [13]

petya-kurochkin ©   (21.05.05 18:21) [11]

см [10]


 
ATarget ©   (2005-05-22 01:11) [14]


> Кстати, а если у меня много оконное приложение, то что мне
> делать, как мне искать не окно, а проект с таким же именем?


ПО ПЕРВОЙ СОЗДАВАЕМОЙ ФОРМЕ она находится даже если в коде встретится form.hide;


 
ATarget ©   (2005-05-22 01:23) [15]

А вот код для поиска ID процесса тупо по полному имени ехе-шника:
uses
 Tlhelp32, Windows, SysUtils;

function findTask(ExeFileName: string): cardinal;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 result := 0;

 FSnapshotHandle := CreateToolhelp32Snapshot
 (TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle,
 FProcessEntry32);

 while integer(ContinueLoop) <> 0 do
 begin
   if ((UpperCase(FProcessEntry32.szExeFile) =
   UpperCase(ExeFileName)) then
     Result := FProcessEntry32.th32ProcessID;
   ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;
 CloseHandle(FSnapshotHandle);
end;


Вызывать так :
*.dpr

program prject1;
...
begin
if findtask(application.exename) <> 0 then halt;
application.initialization;
...
end.
----------

Ну что утешил ? :)


 
Eraser ©   (2005-05-22 18:01) [16]

GrayFace ©   (21.05.05 17:46) [10]

if (CreateMutex(nil, True, "MySuperProject!!!!!!!!!!!")=0) or (GetLastError = ERROR_ALREADY_EXISTS) then halt;


А что если оптимизатор посчитает нужным сначала проверить 2 условие?
имхо на "всякий_пожарный" лучше вариант [4], тем более что кода там ровно столько же, если убрать MessageBox.


 
Eraser ©   (2005-05-22 18:02) [17]

ATarget ©   (21.05.05 17:13) [8]

У этого способа помимо кучи других недостатков, есть такой "Очень интересный заголовок моей главной формы" должен быть ОЧЕНЬ интересным )


 
begin...end ©   (2005-05-22 18:23) [18]

> Eraser ©   (22.05.05 18:01) [16]

> А что если оптимизатор посчитает нужным сначала
> проверить 2 условие?

"Эт вряд ли" (c)

По крайней мере, при отключённой Complete Boolean Eval поведение компилятора документировано -- вычисление выражение будет идти слева направо: Short-circuit evaluation means strict left-to-right evaluation that stops as soon as the result of the entire expression is determined.

Но здесь дело в другом. Непонятно, зачем в коде [10] второе условие. Пусть CreateMutex <> 0, тогда ошибки нет и GetLastError проверять незачем. Пусть, наоборот, CreateMutex = 0, тогда, независимо от значения GetLastError, всё выражение будет истинным, и GetLastError проверять опять незачем.

Я бы сделал так:

if (CreateMutex(...) = 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
 // выход


или так:

if CreateMutex(...) = 0 then
 if GetLastError = ERROR_ALREADY_EXISTS then
   // выход


Первый вариант подойдёт только для {$B-}, второй -- как для {$B-}, так и для {$B+}.


 
GuAV ©   (2005-05-22 20:48) [19]


> Пусть CreateMutex <> 0, тогда ошибки нет и
> GetLastError проверять незачем.

Нет. CreateMutex + F1


 
begin...end ©   (2005-05-22 21:21) [20]

> GuAV ©   (22.05.05 20:48) [19]

Твоя правда. Приношу извинения и прошу всех не обращать внимания на пост [18].


 
alpet ©   (2005-05-23 13:57) [21]

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.041 c
14-1119623819
Kerk
2005-06-24 18:36
2005.07.18
Оргазнизация поиска по сайту


1-1120025637
-=snoop=-
2005-06-29 10:13
2005.07.18
ошибка связанная с добавлением процедуры


14-1119643959
SergP
2005-06-25 00:12
2005.07.18
Где можно бесплатно скачать mp3?


4-1116942710
Aleksandr.
2005-05-24 17:51
2005.07.18
Будет ли работать PostMessage из dll?


14-1119552020
TBender
2005-06-23 22:40
2005.07.18
Сворачивание формы