|
Вопрос # 1 439/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Такой вопрос: нужно запретить запуск копии программы. Нашел много способов, но нужен не громоздкий и, главное, рабочий! Помогите плиз! ;)
 |
Вопрос задал: Hi-tek (статус: 1-ый класс)
Вопрос отправлен: 22 марта 2008, 19:28
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Метод с созданием мьютекса подойдёт? См. приложение.
Приложение: Переключить в обычный режим-
- program p1439;
-
- uses Windows, Messages, ...;
-
- {$R *.res}
-
-
- const
- OneInstMutexName = 'Hi-TekOneInstanceMutex';
- OneInstActivateMessage = 'Hi-TekActivateMessage';
-
- var
-
- MutexHandle: THandle;
- ActivateMessage: Cardinal;
-
-
- procedure HaltProgram;
- begin
- try
- if MutexHandle <> 0
- then CloseHandle(MutexHandle);
- except
-
- end;
-
- Halt;
- end;
-
- function IsNextInstance:Boolean;
- begin
- Result:= False;
- MutexHandle:= 0;
- MutexHandle:= CreateMutex(nil, True, OneInstMutexName);
-
- if MutexHandle <> 0
- then begin
- if GetLastError = ERROR_ALREADY_EXISTS
- then begin
- Result:= True;
- CloseHandle(MutexHandle);
- MutexHandle:= 0;
- end;
- end;
- end;
-
-
- begin
- Application.Initialize;
-
- ActivateMessage:= RegisterWindowMessage(OneInstActivateMessage);
-
- if IsNextInstance
- then begin
- PostMessage(HWND_BROADCAST, ActivateMessage, 0, 0);
- HaltProgram();
- end;
-
-
- Application.CreateForm(TMainForm, MainForm);
- Application.Run;
- end.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 24 марта 2008, 08:38
Оценка за ответ: 4
Комментарий к оценке: Мьютекс это хорошо, но если создать временный файл и занять его программой, а при запуске копии, обращаемся к файлу, а он оказывается занятым, т.о. завершаем работу копии.
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, Hi-tek!
А зачем вы обращаетесь к файлу до проверки на копии запуска ? Это не правильно. Сначало надо проверить есть ли уже запущенные копии, и если нет, то тогда делать все остальные необходимые действия.
А по поводу "Как занять файл программой?", то его следует открывать через потоки Stream с флагом fmShareExclusive. Зайдите на страницу поиска, выберите "Искать в ответах" и введите fmShareExclusive. Вы получите три вопроса в которых приведены примеры по использованию fmShareExclusive.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 24 марта 2008, 16:15
Оценка за ответ: 4
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 24 марта 2008, 14:53; участников в обсуждении: 1.
|
Hi-tek (статус: 1-ый класс), 24 марта 2008, 14:53 [#1]:
Если создать временный файл и занять его программой, а при запуске копии, обращаемся к файлу, а он оказывается занятым, т.о. завершаем работу копии. Вопрос: Как занять файл программой?
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|