Главная страница
    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.073 c
2-1144123858
Тамды
2006-04-04 08:10
2006.04.16
1 нюанс работы с комбобокс


2-1144097727
__alex
2006-04-04 00:55
2006.04.16
Чудеса с глобальными (public) переменными - 2


4-1138371915
mm0
2006-01-27 17:25
2006.04.16
Как грамотно запретить запуск второй копии программы?


3-1140468749
-Антон-
2006-02-20 23:52
2006.04.16
EHLib Rus Help


15-1143032556
MBo
2006-03-22 16:02
2006.04.16
Эксперт для использования в BDS хелпа от D7 или D6





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