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

Вниз

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

 
antistatic ©   (2002-05-22 15:47) [0]

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


 
android ©   (2002-05-22 15:53) [1]

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


 
antistatic ©   (2002-05-22 15:55) [2]

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

нет. только delphi


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

FAQ


 
antistatic ©   (2002-05-22 16:13) [4]

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


 
Song ©   (2002-05-22 16:28) [5]

******************** 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% но с наибольшей стпепенью вероятности.


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

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


 
antistatic ©   (2002-05-22 16:30) [7]

2Song

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


 
antistatic ©   (2002-05-22 16:37) [8]

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


 
Song ©   (2002-05-22 16:37) [9]

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


 
antistatic ©   (2002-05-22 16:40) [10]

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


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

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


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

А я сделал так: в 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 (что мне и надо). Если же эту программу запускать из разных каталогов, то эта защита не сработает.


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

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


 
antistatic ©   (2002-05-22 17:15) [14]

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


 
McSimm ©   (2002-05-22 17:28) [15]

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

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


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

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

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


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

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


 
Fay ©   (2002-05-22 20:11) [18]

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


 
Sergej ©   (2002-05-22 20:56) [19]

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


 
antistatic ©   (2002-05-22 21:11) [20]

2Sergey

Вай, сенкс!


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

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

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



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

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

Наверх




Память: 0.51 MB
Время: 0.018 c
6-7137
Serd_hhc
2002-03-21 09:53
2002.06.03
TServerSocket


14-7217
Keymaster
2002-02-23 20:55
2002.06.03
ХОЧУ ПРАЗДНИК!!!


14-7216
3d[Power]
2002-04-23 21:54
2002.06.03
игруха.


1-7059
Abu
2002-05-21 19:19
2002.06.03
Соединение программ-2


7-7251
ATLANTIDO
2002-03-09 15:36
2002.06.03
Как проверить существование каталога ?