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

Вниз

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

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

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

Наверх




Память: 0.46 MB
Время: 0.05 c
2-1144130460
aleshap
2006-04-04 10:01
2006.04.16
Утечка памяти


4-1138716801
Still Swamp
2006-01-31 17:13
2006.04.16
Тапи


15-1143182243
Vlad Oshin
2006-03-24 09:37
2006.04.16
Под чего бы пристроить Piii 800Mhz 256ram 2scsi винта по 18Gb


2-1143650573
13
2006-03-29 20:42
2006.04.16
удаление из ListView


4-1138029294
Anton B.
2006-01-23 18:14
2006.04.16
Глючит DDE





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский