Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как запретить запуск копии программы?


Страницы:   1 2

antistatic ©   (2002-05-22 15:47:00) 

Как запретить запуск копии программы?


Юрий Зотов   (2002-05-22 21:13:00) [1]

http://www.delphikingdom.com/helloworld/samples_win.htm

Там несколько готовых вариантов решения. И мой совет - не используйте блокировку через поиск окна (FindWindow и т.п.). Почему - уже когда-то обсуждалось, повторяться не хочется. Скажу лишь, что это недостаточно надежно.


antistatic   (2002-05-22 21:11:00) [2]

2Sergey

Вай, сенкс!


Sergej   (2002-05-22 20:56:00) [3]

program Project;

uses
Forms,
Windows,
UMain in "UMain.pas" {...},
...

var
H: hWnd;
PId: DWORD; // ProzessId der schon laufenden Application
Mutex : tHandle;
begin
// Test ob Programm schon l


Fay   (2002-05-22 20:11:00) [4]

2Song
Им так прикольней.
Те, кто хочет пример, сначала зайдут в Help, потом в FAQ, потом снова в Help.
А здесь - это поболтать (во первых).


Song   (2002-05-22 19:17:00) [5]

Вот... напишешь полностью 100% рабочий код и не хватает ума вставить... ну что же.. пошлите мне что ли Ваш dpr, я вставлю Вам этот отрывок... :-/


Andrey007   (2002-05-22 17:30:00) [6]

У меня второй раз не запускается если лишний раз нажать на иконку программы. Как Вы её запускали?

А насчёт как-то ещё - ищите в FAQ.


McSimm   (2002-05-22 17:28:00) [7]

Можно. Есть много способов.
только наверное тоже не помогут.

Это я к тому, что CreateMutex описан в модуле Windows.


antistatic   (2002-05-22 17:15:00) [8]

может можно как-то ещё?


antistatic   (2002-05-22 17:00:00) [9]

Не. не помогает ни то, ни то.
В случае Song, пишет, что не знает, что такое CreateMutex, а в случае Andrey007, сообщение выдаётся, но и программа повторно запускается.


Andrey007   (2002-05-22 16:47:00) [10]

А я сделал так: в dpr написал uses Only,... (Only - первый в разделе uses). А Only.pas имеет вид:

unit Only;

interface

implementation

uses Windows;

var Mutex: THandle;
MutexName: array[0..255] of Char;

function StopLoading : boolean;
var L,I : integer;
begin // В качестве уникального имени мьютекса используем полный путь
// к исполняемому файлу приложения
L:=GetModuleFileName(MainInstance,MutexName,SizeOf(MutexName));
// В имени мьютекса нельзя использовать обратные слэши, поэтому заменяем их на прямые
for I:=0 to L-1 do if MutexName[I]="\" then MutexName[I]:="/";
Mutex:=CreateMutex(nil,false,MutexName);
Result:=(Mutex=0) or // Если мьютекс не удалось создать
(GetLastError=ERROR_ALREADY_EXISTS); // Если мьютекс уже существует
end;

procedure ShowErrMsg;
const PROGRAM_ALREADY_RUN="Программа уже исполняется";
begin
MessageBox(0,PROGRAM_ALREADY_RUN,MutexName,MB_ICONSTOP or MB_OK)
end;

initialization

if StopLoading then
begin
ShowErrMsg;
// Так как никаких инициализаций еще не производилось, то
// спокойно используем для завершения программы Halt -
// finalization все равно выполнится
halt;
end;

finalization

if Mutex<>0 then CloseHandle(Mutex)

end.

Этот вариант блокирует повторный запуск программы в том случае, когда на иконку программы лишний раз кликнули мышью или нажали Enter (что мне и надо). Если же эту программу запускать из разных каталогов, то эта защита не сработает.


Song   (2002-05-22 16:45:00) [11]

Ты присмотрись внимательно к примеру там всё есть.


antistatic   (2002-05-22 16:40:00) [12]

Не, я понял, что в dpr файле.
Я имею в виду что после чего.


Song   (2002-05-22 16:37:00) [13]

Я же написал: в dpr файле.


antistatic   (2002-05-22 16:37:00) [14]

Просто я не очень хорошо разбираюсь в программировании.
Мне бы поподробнее что куда.


antistatic   (2002-05-22 16:30:00) [15]

2Song

А где это писать?


Song   (2002-05-22 16:30:00) [16]

WND в данном случае не нужен (некорректно вырезал из проги)


Song   (2002-05-22 16:28:00) [17]

******************** dpr ****************

Uses ... ;

Const NamedMutex="OneOnly";
Var WND:HWND;

Function CheckInstance(Name:PChar):Integer;
Var R:integer;
Mutex:Integer;
Begin
Mutex:=CreateMutex(nil,true,Name);
R:=GetLastError();
IF r<>0 then Result:=0
else Result:=Mutex;
End;

{$R *.RES}

With Application Do
Begin
IF (CheckInstance(NamedMutex)=0) and (Findwindow(nil,"AppTitle")<>0) then
Begin
ShowMessage("Второй раз не гружусь!");
Exit;
End;
Title:="AppTitle";
Initialize;
CreateForms(...);
Run;
End;


Работает не в 100% но с наибольшей стпепенью вероятности.


antistatic   (2002-05-22 16:13:00) [18]

Ну а можно код, ато не нашёл.


Andrey007   (2002-05-22 15:57:00) [19]

FAQ


antistatic   (2002-05-22 15:55:00) [20]

2android
>>А на С++ пойдет?

нет. только delphi


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо