Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вторая копия приложения в CodeGear, Не работает 
V
    Опции темы
Urvin
  Дата 30.1.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 1.6.2006

Репутация: нет
Всего: нет



Мне необходимо сделать защиту от запуска второй копии приложения.
При попытке запуска появляется ранее запущенная копия.
Всегда пользовался и был рад следующему коду:
Код

procedure TfrmMain.FormCreate(Sender: TObject);
var 
  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
           SetForegroundWindow(wnd);
           ShowWindow(wnd,SW_SHOWNORMAL);
           Halt;
          end;
      end;
    Wnd := GetWindow (Wnd, gw_hWndNext);
  end;
end;


Но с удивлением обнаружил, что в CodeGear данная конструкция не работает.
Не ругется, руками не машет, но позволяет запустить несколько копий приложения.

Я в панике. подскажите, что сделать?
PM MAIL   Вверх
Snowy
Дата 30.1.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Потому что в 2007 изменена концепция главного окна.
Теперь оным является не Application, а главная форма.
Вот её хэндл и ищи.
PM MAIL   Вверх
Alexeis
Дата 30.1.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Urvin, потому что в 2007 версии отделили окно приложения, от окна главной формы, теперь это разные окна. 
GetWindow(Handle, gw_HWndFirst); - теперь неверно, можно попробовать GetWindow(Application.Handle, gw_HWndFirst);

Добавлено через 42 секунды
упс. опередил smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Urvin
Дата 30.1.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 1.6.2006

Репутация: нет
Всего: нет



простите, но... можно как для дебилов?  smile 
PM MAIL   Вверх
Rohoss
Дата 30.1.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: нет
Всего: 18



Цитата(Snowy @  30.1.2008,  17:28 Найти цитируемый пост)
Потому что в 2007 изменена концепция главного окна.

В 2006 тоже?


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Esperito
Дата 30.1.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Рекомендую мьютекс.
PM MAIL   Вверх
Urvin
Дата 30.1.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 1.6.2006

Репутация: нет
Всего: нет



Самый рабочий код с мьютексами, как ни странно, оказался наименее замороченным.
Действительно, вторая копия приложения не стартует.

Код

program Project1;

uses
  Forms,
  Windows, // не забудьте эту строчку
  Unit1 in 'Unit1.pas' {Form1};

  {$R *.RES}

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

begin
  if Check then
    Exit;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.



Как можно изменить данный код, чтобы на экран показывалась предыдущая работающая копия программы? smile
PM MAIL   Вверх
VICTAR
Дата 30.1.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Найти нужное окно FindWindow и поместить его на передний план SetForegroundWindow

Добавлено через 5 минут и 5 секунд
Впрочем, в твоем первом посте все есть
PM MAIL   Вверх
Urvin
Дата 1.2.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 1.6.2006

Репутация: нет
Всего: нет



я все же не справляюсь  smile 
PM MAIL   Вверх
Qu1nt
Дата 2.2.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Код

program Project1;

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

{$R *.res}

function Check: Boolean;
var
  HM : THandle;
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, False, 'MyOwnMutex');
  Result := (HM <> 0);
  if HM = 0 then
    HM := CreateMutex(nil, False, 'MyOwnMutex');
end;

procedure Active;
var
  Wnd  : hWnd;
  Buff : array[0..127] of Char;
begin
  Wnd := GetWindow(Application.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
        SetForegroundWindow(Wnd);
        ShowWindow(Wnd, SW_SHOWNORMAL);
        Halt;
      end;
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
end;

begin
  if Check then
    Active;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Ы?
PM MAIL   Вверх
Urvin
  Дата 2.2.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 1.6.2006

Репутация: нет
Всего: нет



Qu1nt,  твой пример не показывает форму в том случае, если она была свернута.





только что справился по иной технологии, взятой на
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=904

Сильно урезал-доподрезал и вот что получил:
http://urvin.ifolder.ru/5196756
Нашел ошибочку ;) исправляем на
Код

procedure TForm1.WMCommandArrived(var Message: TMessage);
begin
  Application.Restore;
  SetForeGroundWindow(Application.Handle);
  ShowWindow(Form1.Handle, SW_SHOW);
end;


 smile 

Это сообщение отредактировал(а) Urvin - 2.2.2008, 14:03
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.