Форум: "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