Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 439

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Такой вопрос: нужно запретить запуск копии программы. Нашел много способов, но нужен не громоздкий и, главное, рабочий! Помогите плиз! ;)

Hi-tek Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Hi-tek (статус: 1-ый класс)
Вопрос отправлен: 22 марта 2008, 19:28
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Метод с созданием мьютекса подойдёт? См. приложение.

Приложение:
  1.  
  2. program p1439;
  3.  
  4. uses Windows, Messages, ...;
  5.  
  6. {$R *.res}
  7.  
  8.  
  9. const
  10. OneInstMutexName = 'Hi-TekOneInstanceMutex';
  11. OneInstActivateMessage = 'Hi-TekActivateMessage';
  12.  
  13. var
  14.  
  15. MutexHandle: THandle;
  16. ActivateMessage: Cardinal;
  17.  
  18.  
  19. procedure HaltProgram;
  20. begin
  21. try
  22. if MutexHandle <> 0
  23. then CloseHandle(MutexHandle);
  24. except
  25.  
  26. end;
  27.  
  28. Halt;
  29. end;
  30.  
  31. function IsNextInstance:Boolean;
  32. begin
  33. Result:= False;
  34. MutexHandle:= 0;
  35. MutexHandle:= CreateMutex(nil, True, OneInstMutexName);
  36.  
  37. if MutexHandle <> 0
  38. then begin
  39. if GetLastError = ERROR_ALREADY_EXISTS
  40. then begin
  41. Result:= True;
  42. CloseHandle(MutexHandle);
  43. MutexHandle:= 0;
  44. end;
  45. end;
  46. end;
  47.  
  48.  
  49. begin
  50. Application.Initialize;
  51.  
  52. ActivateMessage:= RegisterWindowMessage(OneInstActivateMessage);
  53.  
  54. if IsNextInstance
  55. then begin
  56. PostMessage(HWND_BROADCAST, ActivateMessage, 0, 0);
  57. HaltProgram();
  58. end;
  59.  
  60.  
  61. Application.CreateForm(TMainForm, MainForm);
  62. Application.Run;
  63. 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

Hi-tek (статус: 1-ый класс), 24 марта 2008, 14:53 [#1]:

Если создать временный файл и занять его программой, а при запуске копии, обращаемся к файлу, а он оказывается занятым, т.о. завершаем работу копии. Вопрос: Как занять файл программой?

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.02 сек.