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

Вниз

Как грамотно запретить запуск второй копии программы?   Найти похожие ветки 

 
mm0   (2006-01-27 17:25) [0]

Я сделал несколькиим способами - но у них есть недостаток:Если в процессе работы программы возникла недопустимая ошибка(Окошко Windows с отчетом и кнопкой закрыть) ,то программа уже не запуститься.У меня создавался дискриптор в памяти(см. ниже)

Как грамотно сделать,чтобы учесть эту ситуацию?

function CheckThis: boolean;//Запущена одна копия программы?
var Atom: THandle;
begin
 Atom := GlobalFindAtom("MyPr");
 Result := Atom <> 0;
 if not Result then  GlobalAddAtom("MyPr");
end;
begin
 Application.Initialize;
 if CheckThis then
 begin
   MessageBox(0, "Нельзя запустить две копии программы!", "MyPr", 0);
   Application.Terminate;
   Exit;
 end;
...

и так пытался:
const
 MemFileSize=127;
 MemFileName="MyPr";
var
 MemHnd:HWND;
begin
 MemHnd:=CreateFileMapping(HWND($FFFFFFFF),nil,
 PAGE_READWRITE,0,MemFileSize,MemFileName);
 if GetLastError<>ERROR_ALREADY_EXISTS then
 begin
 ...
 end elseApplication.MessageBox("Приложение уже запущено (возможно оно свёрнуто на панели задач): Нажмите кнопку ОК для продолжения работы","MyPr",MB_OK);
 CloseHandle(MemHnd);


 
Игорь Шевченко ©   (2006-01-27 17:28) [1]

try
except
end
в секции except удалять atom или что там


> и так пытался:


А вот это странно, потому что объекты должны удаляться при завершении процесса.


 
NightAngel   (2006-01-27 21:31) [2]

Можно создать временный файл с атрибутами system+hidden+FILE_FLAG_DELETE_ON_CLOSE. В начале программы нужно только создать файл и все:

...
 hFile:=CreateFile(PChar("prog_start.tmp"),GENERIC_WRITE,0,0,
                   CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN or
                   FILE_FLAG_DELETE_ON_CLOSE,0);
 if (hFile=INVALID_HANDLE_VALUE) then
   MessageBox(0,"Program is Already Running!","Error",MB_ICONERROR);
...

Этот временный файл в программе даже закрывать не требуется.


 
tesseract ©   (2006-01-27 22:23) [3]

Через MUTEX. Содран из рабочего проекта лишнее удали :-)

{$R *.res}
 var  fMutex:Cardinal;
begin
 FMutex:= CreateMutex(nil, false, "Cheese DB");
 if (Fmutex = 0) or (FMutex=INVALID_HANDLE_VALUE) then fMutex:=0;
 if GetLastError=ERROR_ALREADY_EXISTS then begin  ReleaseMutex(fMutex); Fmutex:=0; end;

if fMutex<>0 then
begin
 Application.Initialize;
 Path:=ExtractFileDir(Application.ExeName);
 if not InitApplication then
  begin
    ReleaseMutex(fMutex);
    CloseApplication;
  end;
 Application.Title := "База данных";
 Application.CreateForm(TfmMain, fmMain);
 Application.CreateForm(TdmData, dmData);
 Application.CreateForm(TfmLogin, fmLogin);
 Application.CreateForm(TfmNewCheese, fmNewCheese);
 Application.Run;
 CloseApplication;
 ReleaseMutex(fMutex);
end;
end.


 
Kot_   (2006-01-27 23:23) [4]

{$R *.res}
begin
// проверка на вторую копию
CreateMutex(nil, True, "{C68C1DD9-2CB0-4B2F-9A6A-29F4ADE5707D}");
if GetLastError = ERROR_ALREADY_EXISTS then
begin
  MessageBox(0,"Приложение уже запущенно. Запуск второй копии запрещен!","Ошибка",MB_OK + MB_ICONERROR + MB_DEFBUTTON1);
  Exit;
end;

 Application.Initialize;
 Application.CreateForm(TFormPredpr, FormPredpr);
 Application.CreateForm(TFormIdentif, FormIdentif);
 Application.Run;
end.


у меня такой код, работает под WinXP, на других системах не проверял


 
VirEx ©   (2006-01-28 10:29) [5]

мьютекс убивается когда приложение выгружается, а атом остаётся до перезагрузки ОС, хм... может быть и до выхода юзверя из сеанса (посмотри), либо после GlobalDeleteAtom


 
sicilla ©   (2006-01-28 20:00) [6]

Вот мой способ:
program ****;

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

{$R *.res}

var hwnd: THandle;

begin
    hwnd := findwindow("TForm1","Название");
    if hwnd = 0 then
       begin
            Application.Initialize;
            Application.Title := "Название";
            Application.CreateForm(TForm1, Form1);
            Application.Run;
       end
    else SetForegroundWindow(hwnd);
end.

Во время запуска рабочее название формы должно отличаться от Название. Иначе не запустить
Работает отлично


 
kaZaNoVa ©   (2006-01-28 20:12) [7]

sicilla ©   (28.01.06 20:00) [6]
program ****;

почему звёздочки? этот код был примером из одного троянчика :)))) а по теме, findwindow  я бы не сказал, что очень надёжная функция .. например она не найдет программу, запущенную на другом декстопе .. (на этом же компе)


 
sicilla ©   (2006-01-28 20:31) [8]

Удалено модератором
Примечание: Выражения выбираем



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

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

Наверх




Память: 0.49 MB
Время: 0.071 c
15-1142938271
Некто
2006-03-21 13:51
2006.04.16
ГОСТ техническое задание


2-1143713073
SeZu
2006-03-30 14:04
2006.04.16
Транзакции


3-1140501583
dreamse
2006-02-21 08:59
2006.04.16
проблема с хранимой процедурой


2-1143980731
Khim
2006-04-02 16:25
2006.04.16
Нажатие кнопок меню на TAppBuilder


3-1140605813
DelphiLexx
2006-02-22 13:56
2006.04.16
FIBDataSet - MasterDetail