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

Клуб программистов

  Все выпуски  

Клуб программистов - Выпуск 29


КЛУБ ПРОГРАММИСТОВ

в рассылке статьи, ссылки, инфо и многое другое о программировании и программистах

Новости

Лабораторные работы

Справочники

Книги

Основы Delphi

Клуб

Чат

Форум

От ведущего

Всем привет! Сегодня у меня хорошее настроение, вам повезло ))) В общем, пишу сегодня про наш новый проект - Блог программистов, перепечатываю оттуда кое-что на тему "Общение между запущенными копиями своих программ", ну и без юмора не обойтись!

На следующей тоже ожидайте новенькое ))

__________________________________________________________

 

Общение между запущенными копиями своих программ

Рассматривать задачу будем на конкретном примере некого приложения.

Опишем предметную область и постановку задачи:

необходимо чтобы наше приложение, зарегистрировав себя как протокол в системе Windows, позволяло при нажатии на ссылкуу вида testproject:\\xxxxx запустило наше приложение (если оно не запущено) и передало ему параметры ссылки. Если же приложение уже запущено, то нам не обходимо запущеной копии приложения сообщить параметры ссылки.

Ну чтож, задачу описали, приступим к реализации.

Для примера я буду использовать BDS 2006.

Создадим новый проект.

Сначала нам необходимо зарегистрироваться в реестре, чтобы система воспринимала правильно наши ссылки, поэтому:

в uses главной формы дописываем модуль registry

в событии onactivate главной формы пишем:

procedure Tfstart.FormActivate(Sender: TObject);
var reg:tregistry;
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_Classes_Root;
if not(reg.KeyExists(’testproject’)) then
begin
reg.OpenKey(’testproject’,true);
reg.WriteString(”,’URL:testproject Protocol’);
reg.WriteString(’URL Protocol’,”);
reg.OpenKey(’DefaultIcon’,true);
reg.WriteString(”,application.ExeName);
reg.CloseKey;
reg.OpenKey(’testproject\shell\open\command’,true);
reg.WriteString(”,application.ExeName+’ %1′);
reg.CloseKey;
end;
reg.Free;
end;

Соответственно мы имеем зарегистрированный в системе протокол под названием testproject.

Проверить это можно достаточно простым способом:

Открываем любой браузер и в адресной строке набираем “testproject:\\eee” и запустится ваша программа.

Теперь продолжим. Нам необходимо опеределять запущена ли наша программа уже или нет. Для решения подобной задачи существует множество способов, но я предпочитаю способ с использованием mutex-ов. Не буду сейчас вдавать в подробности описания мьютексов и их использования. Итак, заходим в код самого нашего проекта и пишем там:

program testproject;

uses
Forms,windows,
Ustart in ‘Ustart.pas’ {fstart};

{$R *.res}
var HM: THandle;
function Check: boolean;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, ‘TestProjectMutex’);
Result := (HM <> 0);
if HM = 0 then HM := CreateMutex(nil, false, ‘TestProjectMutex’);
end;

begin
Application.Initialize;
Application.CreateForm(Tfstart, fstart);
Application.Run;
end.

Итак, в результате у нас есть функция, возвращающая true если копия проекта запущена и false если это первая копия.

Теперь далее: нам необходимо понять запущено ли приложение с сылки или просто кто- то запустил наш exe.

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

if (check)and(paramcount>0) then

begin

end;

Итак, что же мы будем делать если такой процесс уже есть? Нам соответсвенно необходимо каким- то образом сообщить запущенному процессу те параметры, которые нам передали. Отсюда встает вопрос: нам необходимо знать Handle нашего уже запущенного приложения. Здесь все подвластно исключительно вашей фантазии, так как сделать это можно сколь угодно множеством способов. Я выберу далеко не лучший, но для примера: я буду хранить handle в реестре. для этого модифицируем сначала onactivate нашей главной формы:

procedure Tfstart.FormActivate(Sender: TObject);
var reg:tregistry;
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_Classes_Root;
if not(reg.KeyExists(’testproject’)) then
begin
reg.OpenKey(’testproject’,true);
reg.WriteString(”,’URL:testproject Protocol’);
reg.WriteString(’URL Protocol’,”);
reg.OpenKey(’DefaultIcon’,true);
reg.WriteString(”,application.ExeName);
reg.CloseKey;
reg.OpenKey(’testproject\shell\open\command’,true);
reg.WriteString(”,application.ExeName+’ %1′);
reg.CloseKey;
end;
reg.RootKey:=HKEY_current_user;
reg.OpenKey(’software\testproject’,true);
reg.WriteInteger(’handle’,fstart.Handle);
reg.CloseKey;

reg.Free;
end;

далее добавим обработчик события CloseQuery нашей формы:

procedure Tfstart.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var reg:tregistry;
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_current_user;
reg.OpenKey(’software\testproject’,true);
reg.WriteInteger(’handle’,0);
reg.CloseKey;
reg.Free;
end;

таким образом при закрытии программы мы будем обнулять наш handle.

теперь вернемся к коду нашего проекта. Итак, нам необходимо если это не первая копия приложения, прочитать handle и отправить ему сообщение с параметрами коммандной строки. Приведу сразу код: ...

А продолжение читайте тут: http://pblog.ru/?p=8

__________________________________________________________

 

Блог программистов

Клуб программистов и Форум программистов рады представить публике новый проект - Блог программистов!
С этого дня блог запускается и будет активно работать. Здесь нас ожидают статьи и новости от участников Клуба.
Наш Клуб общается на Форуме программистов, куда все приглашаются. Там всегда самые горячие обсуждения, ответы на самые сложные вопросы и просто общение.

Конкурс проводился в течении двух месяцев в нашем Клуб программистов.

__________________________________________________________

 

Немного юмора

Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.

***

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

***

Штирлиц просматривал электронную почту. hезаметно входит Мюллер. У Штирлица на экране бессмысленный набор символов. "Шифровка!!!" - подумал Мюллер. "koi-8" - подумал Штирлиц.

***

Системщику на день рождения подарили чемодан. Ну он спрашивает:
- Зачем?
- Ну как, - говорят, - ты же в командировки там всякие ездишь, системки отлаживать?
- Ну...
- Так вот, сюда трусики положишь, сюда носочки, сюда...
- Стоп, стоп, ребята! А в чем же я сам поеду?

***

Заходит новый русский к провайдеру и говорит:
- Мне мой компьютерщик сказал, у вас узнать -...начинает искать по карманам... ничего не находит)... - ну, там было что-то про задницу три раза и адрес! Набирает на мобильнике свой офис. Все, затаив дыхание, ждут факса с запросом, через пару минут вылазиит бумага, а там: "Пришлите, пожалуйста, адрес вашего РОР3 сервера."

***

cантехник ковыряется в унитазе. Прочищает засор типа... Вдруг замечает, что за ним наблюдает мальчик.
- Что мальчик, неприятно? Это тебе, панимашшь, не в Интернете копаться...

***

Лена: А у нас вчера под окнами hЛО висело... Хакер(злобно, не отрываясь от компьютера):
-Кто ж его под "окнами" ставит, надо было под linux, тагда б не зависло...

***

Ходят 2 подружки по магазинам модной одежды. Зашли в один и просят продавца помочь подобрать прикид. Он:
-Какой у вас размер?
-Рост 170, вес 60, 90-60-90, размер груди 3, волосы... Вторая:
-Анька, очнись, ты не в icq!!!

Юмор от членов клуба программистов здесь.

__________________________________________________________

 

Программистам на заметку

Если у вас есть желание поделиться своим опытом с читателями, вы являетесь обладателем ценных, интересных статей или авторских программ, а может вы просто хотите высказать свое мнение или замечание о рассылке, просто напишите мне. Я постараюсь уделить внимание каждому. А "Клуб программистов" всегда рад приветствовать в своих рядах новых пользователей.

 

© 2006, Кочари Арнольд и "Клуб программистов"


В избранное