Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 11.10.2009, 18:13   #1
Vol666
Гуру Разврата
Форумчанин
 
Аватар для Vol666
 
Регистрация: 29.07.2009
Адрес: в средних веках
Сообщений: 373
Репутация: 43

icq: 591189805 Отправить сообщение для Vol666 с помощью MSN
skype: sy_9090
По умолчанию Проверка запущена ли ещё одна копия приложения

Есть у кого-нибудь решение данной проблемы? Решать это двумя программами нельзя.
__________________
Фредди вернулся))) И Готов Убивать!!!
Vol666 вне форума   Ответить с цитированием
Старый 11.10.2009, 18:14   #2
Alex Cones
Trust no one.
Профессионал
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Адрес: In the middle of nowhere.
Сообщений: 6,526
Репутация: 1440
По умолчанию

Ищите хендл с классом и заголовком Вашего окна - не найдете - копия одна, найдете - кильните его.

Можно еще так:
Код:
program Project1;

uses
  Windows,
  Forms,
  Dialogs,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
Var HM :THandle;

function Check: boolean;
begin
  HM:=OpenMutex(MUTEX_ALL_ACCESS, false, 'Proj');
  Result:=(HM<>0);
  if HM=0 then HM:=CreateMutex(nil, false, 'Proj');
end;

begin
If Check then
begin
  ShowMessage('Извините, но одна из копий программы уже запущена.');
  exit;
end;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
__________________
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 11.10.2009 в 18:17.
Alex Cones вне форума   Ответить с цитированием
Старый 11.10.2009, 18:20   #3
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Профессионал
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
Репутация: 624
По умолчанию

delphiworld
Код:
uses
  SysUtils, WinTypes, WinProcs, WinCrt;
..............................................
var
  NumInstances, SavePrevInst: word;
......................................................
procedure GetInstanceData(hInst, Offset, Size: Word); far; external 'KERNEL';
begin
  SavePrevInst := hPrevInst;
  NumInstances := 0;
  while hPrevInst <> 0 do
  begin
    GetInstanceData(hPrevInst, Ofs(hPrevInst), SizeOf(hPrevInst));
    Inc(NumInstances);
  end;
  Writeln('Уже запущено ', NumInstances, ' копий программы');
  hPrevInst := SavePrevInst;
end.
__________________
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума   Ответить с цитированием
Старый 11.10.2009, 20:01   #4
JTG
я получил эту роль
Профессионал
 
Аватар для JTG
 
Регистрация: 25.05.2007
Адрес: тут темно и с потолка капает
Сообщений: 3,694
Репутация: 2224

icq: III 37373860
По умолчанию

Цитата:
delphiworld
...
GetInstanceData
Что ещё раз доказывает, что delphiworld - сборник, извиняюсь, быдлокода.
__________________
пыщь
JTG вне форума   Ответить с цитированием
Старый 11.10.2009, 20:19   #5
raxp
Профессионал
 
Регистрация: 29.09.2009
Сообщений: 9,742
Репутация: 3006
По умолчанию

почему забыли про - GlobalAddAtom? в проекте формы...
Код:
var PIWin : hWnd;
    AtomFN: WParam;
begin
  //антизапуск 2-копии
  PIWin := FindWindow(WINDOWCLASSNAME, NIL);
  if PIWin <> 0 then
    begin
     if Paramcount = 0 then halt;
     AtomFN := GlobalAddAtom(pChar(paramstr(1)));
     PostMessage(PIWin, CM_OPENFILE, AtomFN, 0);
     halt;
    end;
  //Run program
  Application.Initialize;
  ...
__________________
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума   Ответить с цитированием
Старый 12.10.2009, 00:20   #6
andreibtzt
Заблокирован
 
Регистрация: 04.04.2009
Сообщений: 43
Репутация: 7
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
Var ExtEndedStyle:dword;
Wnd : hWnd;
buff : Array[0.. 127] of Char;
Begin
Wnd := GetWindow(Handle, gw_HWndFirst);
While Wnd <> 0
DO
Begin
If (Wnd <> Application.Handle)
and (GetWindow(Wnd, gw_Owner) = 0) Then
Begin GetWindowText (Wnd, buff, sizeof (buff ));
If StrPas (buff) = Application.Title Then
Begin
showmessage('....');
Halt;
End;
End;
Wnd := GetWindow (Wnd, gw_hWndNext);
End;
End;
andreibtzt вне форума   Ответить с цитированием
Старый 12.10.2009, 00:38   #7
mutabor
Телепат с дипломом
Профессионал
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
Репутация: 1570

icq: 401708834
По умолчанию

Цитата:
AtomFN := GlobalAddAtom(pChar(paramstr(1)));
А если запустить из другой директории?

эмм.. 1 это вроде уже доп. параметр, 0 - путь к программе, судя по коду там 0 должен быть, или я не так понял?

Последний раз редактировалось mutabor; 12.10.2009 в 00:40.
mutabor вне форума   Ответить с цитированием
Старый 12.10.2009, 00:56   #8
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Адрес: SPB???
Сообщений: 320
Репутация: 110
По умолчанию

Можно ещё с помощью мьютекса это сделать. Только не в .pas файлах, а в главном проекте .dpr:

Код:
// ...

var
  H, hMutex : THandle;

{
  -- Мьютекс для блокировки копии второй программы
  -- При попытке запуска второй копии - переключение на существующую
}

begin
  hMutex := CreateMutex(nil, False, 'OneCopyMutex');
  H := FindWindow('TMainFormGUI', nil);
  if WaitForSingleObject(hMutex, 0) <> Wait_TimeOut then begin
      Application.Initialize;
      Application.CreateForm(TMainFormGUI, MainFormGUI);
      Application.CreateForm(TAboutBox, AboutBox);
      Application.CreateForm(TPlagInForm, PlagInForm);
      Application.CreateForm(TInspectForm, InspectForm);
      // ...
      Application.Run;
  end else begin
      SetForegroundWindow(H);
      exitprocess(0);
  end;
end.
BaronTreep вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ещё одна проблема с программой на Си osichev Помощь студентам 1 07.06.2009 21:40
и ещё одна задачка...9 слонов MiH@N Помощь студентам 4 24.06.2008 00:03
Вот ещё одна,самая сложная: felice Паскаль 4 03.02.2008 18:21


17:08.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.