Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.036 c
1-1119952704
SergZ
2005-06-28 13:58
2005.07.18
DevExpress


14-1119350268
Xmen
2005-06-21 14:37
2005.07.18
Лицензионная программа


1-1120000398
TechnoDreamer
2005-06-29 03:13
2005.07.18
TEdit и AutoSelect


1-1120194862
alexeis
2005-07-01 09:14
2005.07.18
ComboBox и Objects


14-1119448178
PZ
2005-06-22 17:49
2005.07.18
Военные стихи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский