Как определить, что приложение уже запущено?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

LAngel писал(а):FindWindow "всегда" находит окно, только когда приложение запущено в дизайн-тайм (под оболочкой дельфы), потому что в оболочке существует окно с тем же классом и заголовком.
Попробуй закрыть проект и запустить exe, тогда все будет работать как положено :)
Воистину так!

Спасибо огромное за такий "хинт". Буду знать. Проверил - и в самом деле при закрытой Delphi приложение при запуске не находит себя, т.е. запускается, как и следует ожидать.
Правда, возникакет практический вопрос. Если пользоваться такой проверкой, то как бедному программисту отлаживаться, т.е. запускаться из-под Delphi? Постоянно комментарить эту проверку и раскомментаривать ее при компиляции "релиза" - нудно, да и в какой-нибудь очередной раз забудешь это сделать.

Может быть есть какой-то способ run-time определить, что приложение запущено из-под среды разработки? Тогда бы можно было запрограммировать так:

Код: Выделить всё

if &#40]

А через [b]CreateFileMapping[/b] тоже, вроде как, получилось. Спасибо за наводку. Нашел в интернете пример, содрал :) Правда, дюже длинный текст оказался (по сравнению с FindWindow) :)
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Я пользуюсь методом определения запущенности с помощью мютексов:

Код: Выделить всё

var
  mh: THandle;
begin
  mh := OpenMutex(MUTEX_ALL_ACCESS, True, 'lacd');
  if mh <> 0 then
  begin
    MessageBox(0, 'Second start of lacd client detected.', 'LostAngel''s WoW cheating death client', MB_ICONERROR + MB_OK);
    Halt;
  end;
    mh := CreateMutex(nil, True, 'lacd');
    try
       //... код
    finally
      ReleaseMutex(mh);
    end;
end;
а так вообще - можно пользоваться тегами компилятора и изменять их соответственно при компиляции "готового" продукта:

Код: Выделить всё

{$DEFINE DEBUG}
{$IFDEF DEBUG}
...
{$ELSE}
...
{$ENDIF}
С уважением, Lost Angel...
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

LAngel писал(а):а так вообще - можно пользоваться тегами компилятора и изменять их соответственно при компиляции "готового" продукта:

Код: Выделить всё

&#123][/quote]
Условная компиляция - вещь временами нужная.
Но, опять же, в данном случае, как было сказано, это "реле", которое нужно время от времени не забывать включать/выключать.
Т.е. не очень удобно не то, что надо делать много исправлений (в случае отключения символа для условной компиляции их мало - добавить/убрать всего один символ текста), а то, что надо постоянно помнить об этом.
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

а ты чтоб не забыть при включенной директиве в заголовок выводи - DEBUG!!! ;)
Изображение
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Может быть есть какой-то способ run-time определить, что приложение запущено из-под среды разработки?
Есть такая функция - IsDebuggerPresent(), см. MSDN
По основному вопросу повторю - лучше пользоваться стандартными средствами, т.е. ставить мьютекс.
Ответить