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

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

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

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

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

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

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

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

Можно еще так:
Код:
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
По умолчанию

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
По умолчанию

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

почему забыли про - 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
По умолчанию

Код:
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
По умолчанию

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

эмм.. 1 это вроде уже доп. параметр, 0 - путь к программе, судя по коду там 0 должен быть, или я не так понял?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

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

Можно ещё с помощью мьютекса это сделать. Только не в .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 вне форума Ответить с цитированием
Ответ


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



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