Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Мастера DELPHI. Новости мира компонент, FAQ, статьи...


Информационный Канал Subscribe.Ru

Ежедневная рассылка сайта Мастера DELPHI

DELPHIMASTER.ru

Выпуск от 05.12.03 11:29

Кое-что из нашей кладовки   |x|
Лучшее из нашего FAQ   |x|
Как определить работает ли уже данное приложение или это первая его копия?
Для Delphi 1. Каждый экземпляр программы имеет ссылку на свою предыдущую копию - hPrevInst: hWnd. Ее можно проверить перед созданием приложения и при необходимости отреагировать соответствующим образом. Если запущена только одна копия, то эта ссылка равна нулю.
Пример:


procedure TForm1.FormCreate(Sender: TObject);
begin
 {Проверяем есть ли указатель на предыдущую копию приложения}
 IF hPrevInst <> 0 THEN BEGIN
   {Если есть, то выдаем сообщение и выходим}
   MessageDlg('Программа уже запущена!', mtError, [mbOk], 0);
   Halt;
 END;
 {Иначе - ничего не делаем (не мешаем созданию формы)}
end;


P.S. Для выхода необходимо использовать Halt, а не Close, как хотелось бы, так как форма еще не создана и закрывать нечего.
Есть и другой способ - по списку загруженных приложений




procedure TForm1.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
   MessageDlg('Приложение уже загружено', mtWarning, [mbOk], 0);
   Halt;
  END;
 END;
 Wnd := GetWindow (Wnd, gw_hWndNext);
END;
End;


Еще один интересный способ для Win32. Дело в том, что можно в памяти создавать временные файлы. При перезагрузке они теряются, а так существуют. Кстати, этот метод можно использовать и для обмена информацией между вашими приложениями.

Пример:


program Project1;
uses
 Windows, // Обязательно
 Forms,
 Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}
Const
MemFileSize = 1024;
MemFileName = 'one_inst_demo_memfile';
Var
MemHnd : HWND;
begin
 { Попытаемся создать файл в памяти }
 MemHnd := CreateFileMapping(HWND($FFFFFFFF),
                             nil,
                             PAGE_READWRITE,
                             0,
                             MemFileSize,
                             MemFileName);
 { Если файл не существовал запускаем приложение }
 if GetLastError<>ERROR_ALREADY_EXISTS then
 begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
 end;
 CloseHandle(MemHnd);
end.


Часто при работе у пользователя может быть открыто 5-20 окон и сообщение о том, что программа уже запущено приводит к тому, что он вынужден полчаса искать ранее запущенную копию. Выход из положения - найдя копию программы активировать ее, для чего в последнем примере перед HALT необходимо добавить строку :
SetForegroundWindow(Wnd);
Например так:


program Project0;
uses
 Windows,  // !!!
 Forms,
 Unit0 in 'Unit0.pas' {Form1};

var
 Handle1 : LongInt;
 Handle2 : LongInt;

{$R *.RES}

begin
 Application.Initialize;
 Handle1 := FindWindow('TForm1',nil);
 if handle1 = 0 then
   begin
     Application.CreateForm(TForm1, Form1);
     Application.Run;
   end
 else
   begin
     Handle2 := GetWindow(Handle1,GW_OWNER);
      //Чтоб заметили :)
     ShowWindow(Handle2,SW_HIDE); ShowWindow(Handle2,SW_RESTORE);
     SetForegroundWindow(Handle1); // Активизируем
   end;
end.




Комментарий от "Vladimir" (damageinc@e-mail.ru)
Лучше  всего  использовать  именованные  мутексы.  Главное,  придумать
уникальное  имя  для  этого мутекса. Вот пример вполне работоспособной
программы:

program My1;
uses
 Forms, Windows, Dialogs, SysUtils,

var
g_hAppMutex: THandle;
Wnd : hWnd;
buff: array [0..127] of Char;
s:string;
i:integer;

function OneInstance: boolean;

begin
g_hAppMutex:=CreateMutex(nil,false,PChar('AnUniqueString'+IntToStr(GetDesktopWindow)));
Result:=(WaitForSingleObject(g_hAppMutex,0)<>WAIT_TIMEOUT);
end;

begin
 Application.Initialize;
 Application.Title := 'SmartDecoder';
 Application.HelpFile := 'Decoder.hlp';
 //создаём инстанс, если его ещё нету на текущем рабочем столе
 g_hAppMutex:=0;
 if OneInstance then
    begin
     Application.CreateForm(TMainFrm, MainFrm);
     Application.Run;
    end;
 if LongBool(g_hAppMutex) then //если уже есть
    begin
     ReleaseMutex(g_hAppMutex);
     CloseHandle(g_hAppMutex);
     if  ParamStr(1)=''  then  ShowMessage('Программа уже запущена на
     этом  рабочем столе. Нажмите кнопку "OK" для передачи управления
     уже запущенной копии программы.');
     Wnd:=GetWindow(GetTopWindow(0),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 Copy(StrPas(buff),1,12)='SmartDecoder' then
              if Wnd=GetWindowLong(Wnd,GWL_USERDATA) then
                 begin
                  ShowWindow(Wnd,SW_ShowNormal);
                  SetForegroundWindow(Wnd);
                  i:=1;
                  while ParamStr(i)<>'' do
                   begin
                    s:=ParamStr(i);
                    PostMessage(Wnd,WM_OPEN_FILE,GlobalAddAtom(PChar(s)),0);
                    inc(i);
                   end;
                  Application.Terminate;
                  Exit;
                 end;
          end;
       Wnd:=GetWindow(Wnd,gw_hWndNext);
      end;
    end;
end.

Если  программа  уже  запущена, управление будет передано существующей
копии.

»»» Прислать свои комментарии

Обсуждается в конференциях   |x|
  • Form.OnPaint
    Почему по время сабжа нельзя использовать Formanvas.Handle (ничего не происходит)? Есть ли разница между тем DC, ...
  • Температура Процессора
    Подскажите можно ли в Win 2000 следить за температурой процессора через WMI , если можно то как?
  • Как скрыть процесс под NT
    Наверное этот вопрос задают каждый день, но все же как скрыть процесс под NT. Может хоть урл кинете.
  • Имя пользователя терминала Win2k
    Как в терминальном режиме узнать логин пользователя? Или как узнать имя пользователя из BDE локальной машины при ...
  • Direct3D
    Недавно начал изучать.Есть вопрос ,как создать объекты где вектора используются несколько раз.Тоесть если я создаю куб ...
  • Обработка ошибок в MSSQL
    Доброго всем вечера!!! Можно ли в MSSQL производить обработку исключений, таки мобразом, чтобы выдавалось сообщение об ...
  • Проблема совместимости.....
    Добрый день, кто-нибудь сталкивался с проблемой совместимости программы и операц.системы?? У меня такая проблема, на ...
У нас большой выбор статей   |x|
Как добиться успеха в безнадежных проектах
Многим руководителям ИТ-проектов знакомы ситуации, когда прекрасно спланированный процесс не укладывается во временные рамки. Несмотря на то что сроки были определены с запасом, одни модули «забирают» все доступные ресурсы, другие сразу после появления на свет удаляются за ненадобностью, а постоянные изменения требований окончательно разрушают проект.
Новинки книжного рынка   |x|
Скрипты для администратора Windows. Специальный справочник
Книга содержит базовые сведения, описания и примеры скриптов, используемых для администрирования Windows. Рассматриваются основные команды и ключевые слова, используемые в интерпретаторе .bat файлов, интерпретаторе KiXtart и Windows Script Host. В книге приведены рабочие примеры скриптов, выполняющих самые разнообразные задачи по автоматизации работы в среде Windows.
Автор: Торрес Дж.
Наши друзья   |x|
Сертификация специалистов
∙ Как устроиться на высокооплачиваемую работу?
  Как получить прибавку к зарплате?
  Как завоевать уважение коллег?
∙ Пройти сертификацию и продемонстрировать свой профессионализм. Подробнее…
Другие сайты о DELPHI   |x|
Компоненты gLiDlib
Компоненты gLiDlib для Delphi 6.
gLiDlib - это компоненты, которые позволяют быстро и качественно создавать клиент-серверные приложения.
Есть пошаговый пример создания небольшой программки.

» Оценка сайта: 2
Опрос населения :)
Новый журнал для программистов "RSDN Magazine". Готовы ли вы подписаться на него?
»»» Да, на сколько возможно
»»» Да, на 6 месяцев
»»» Да, на 3 месяца
»»» Да, на 1 месяц
»»» Нет, не готов
»»» Не знаю
Для души

Хокку дня
Всё в мире быстротечно!
Дым убегает от свечи,
Изодран ветхий полог.

Афоризмы
Расизм - это снобизм бедняков... (Арон)

Фраза дня
Я не грустный - я трезвый

Дурацкие законы (информация предоставлена сайтом kurilka.com)
В городе Зайон в Иллонойсе (США) запрещается давать зажженые сигары кошкам, собакам и другим домашним животным.
В Кармеле в штате Нью Йорк (США), мужчине грозит штраф, если он выйдет на улицу в штанах, которые не подходят к пиджаку.

И на закуску коротенький анекдот
Посетитель ресторана говорит:
- Водки не надо, я за рулем.
Через некоторое время официант приносит графин с водкой:
- Можете пить: вашу машину угнали.

Фотоприколы.
Начните день с хорошего настроения!
http://www.delphimaster.ru/cgi-bin/prikol.pl?id=8733


На этом позвольте откланяться и пожелать вам удачного дня.
Искренне ваш, Алексей (merlin@delphimaster.ru)

Добро пожаловать на сайт -= Мастера DELPHI =- 


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное