Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2011, 04:56   #1
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию Ссылка на переменную в главном модуле

Здравствуйте, в общем проблема такая: хочу сделать запрет на повторный запуск приложения, НО так как название окна меняется на имя открытого в данный момент файла, то ничего не получается сделать. У меня в модуле главной формы есть стрингвая переменная, в которой содержится путь до файла, далее с помощью ExtractFilePath извлекаю имя файла и присваиваю его названию приложения, и получаю, допустим, такой caption 1.bmp, а проверка идет только на начальное имя:
Код:
if wintext='Default.bmp'  then
 begin
      exitprocess(0);
      end;
А вот теперь вопрос: можно ли в wintext передать значение переменной из Unit1? То есть
Код:
if wintext=ExtractFilePath(*/переменная из Unit1\*)  then
 begin
      exitprocess(0);
      end;
P.S код проверки в тексте основного проекта.

Последний раз редактировалось ZvEr_HaCkEr; 16.06.2011 в 08:31.
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 16.06.2011, 08:35   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А зачем привязываться к заголовку окна? Как по мне гораздо удобнее для этих целей использовать OpenMutex и CreateMutex
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.06.2011, 08:44   #3
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

А можно поподробнее?
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 16.06.2011, 08:58   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код для .dpr
Код:
const srMutexName = 'GLOBAL_ATOM_FOR_12435YYYYFFFF';
var srMutex: THandle;

{$R *.res}

begin
  srMutex:=OpenMutex(SYNCHRONIZE,False,PChar(srMutexName));
  if srMutex<>0 then Exit; //приложение запущено ранее
  srMutex:=CreateMutex(nil,True,PChar(srMutexName));
  if srMutex=0 then begin
    spError('Ошибка запуска приложения!'+#13+'[Не создан мьютекс]',nil); //spError мой аналог ShowMessage (точно не помню)
    Exit;
  end;
  Application.Initialize;
  ....
  try
    Application.Run;
  finally
    ReleaseMutex(srMutex);
  end;
end.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.06.2011, 11:29   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Код для .dpr

в этом коде есть ненулевая вероятность того, что две копии, запущенные одновременно, сначала не найдут мютекс, а потом одна копия его создаст, а вторая откроет уже созданный. И запустятся 2 копии.

Вот так бы я написал:

Код:
var
  f_m: THandle;	// mutex
begin
  f_m := CreateMutex(nil, true, srMutexName);
  if ( (ERROR_ALREADY_EXISTS = GetLastError()) or (ERROR_ACCESS_DENIED  = GetLastError()) ) then begin
    //
    if (0 <> f_m) then CloseHandle(f_m);
    MessageBox('Another instance is already running');
  end
  else try
    //
    Application.Initialize;
    ...
    Application.Run;
    //
  finally
    CloseHandle(f_m);
  end;
end.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 16.06.2011, 14:08   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
>в этом коде есть ненулевая вероятность того, что две копии, запущенные одновременно, сначала не найдут мютекс, а потом одна копия его создаст, а вторая откроет уже созданный. И запустятся 2 копии.
Согласен Если очень быстро дважды вызвать одно и тоже, то вероятность есть. Правда пока не сталкивался. Нужно эксперимент провести
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.06.2011, 15:28   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если есть вероятность то лучше её исключить сразу.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.06.2011, 17:25   #8
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

А srMutexName определяет первоначальное имя приложения, если я все правильно понял?
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 16.06.2011, 20:26   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Это строковая константа, с любым содержанием, желательно более экстравагантным для обеспечения уникальности ее содержимого, чтобы случайно не совпала с мьютексом другого приложения
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.06.2011, 11:15   #10
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Всем спасибо! А как в случае, когда рубится копия приложения вывести первую копию на передний план?
P.S посмотрел здесь, но что-то не получается.
ZvEr_HaCkEr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылка на переменную t2skler Общие вопросы Delphi 5 16.02.2011 19:12
TSaveDialog и иницилизация COM в главном потоке. nik531 Компоненты Delphi 0 05.02.2010 10:38
2 контенера в главном контенере sergej_86 HTML и CSS 1 06.12.2009 18:27
Ссылка на переменную в условии отбора запроса bag Microsoft Office Access 1 06.09.2009 20:37
почему-то в подключаемом модуле не видно глобальную переменную bat Общие вопросы C/C++ 4 23.08.2007 14:25