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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
1-7083
The great man
2002-05-22 09:08
2002.06.03
Как сделать запрос на номер программы при первом запуске.


1-6984
Елена
2002-05-22 15:15
2002.06.03
Модифицировать строку


6-7142
yaJohn
2002-03-22 17:12
2002.06.03
Таймаут у ClientSocket.


1-6988
Мефодий
2002-05-22 22:37
2002.06.03
Центрирование ячейки таблицы при создании отчета в Word


6-7156
Kwinta
2002-03-21 13:58
2002.06.03
сетевой монитор





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