Всем привет!
Сегодня у меня хорошее настроение, вам повезло ))) В общем, пишу сегодня
про наш новый проект - Блог программистов, перепечатываю оттуда кое-что
на тему "Общение между запущенными копиями своих программ", ну и без
юмора не обойтись!
Рассматривать задачу
будем на конкретном примере некого приложения.
Опишем предметную
область и постановку задачи:
необходимо чтобы
наше приложение, зарегистрировав себя как протокол в
системе 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 и
отправить ему сообщение с параметрами коммандной
строки. Приведу сразу код: ...
Клуб программистов
и Форум программистов рады
представить публике новый проект - Блог программистов!
С этого дня блог запускается и будет активно работать. Здесь нас ожидают
статьи и новости от участников Клуба.
Наш Клуб общается на Форуме
программистов, куда все приглашаются. Там всегда самые горячие
обсуждения, ответы на самые сложные вопросы и просто общение.
Компьютер позволяет решать
все те проблемы, которые до изобретения компьютера не существовали.
***
Когда нормальный
человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер
ставит на нее счетчик...
***
Штирлиц просматривал
электронную почту. hезаметно входит Мюллер. У Штирлица на экране
бессмысленный набор символов. "Шифровка!!!" - подумал Мюллер. "koi-8" -
подумал Штирлиц.
***
Системщику на день
рождения подарили чемодан. Ну он спрашивает:
- Зачем?
- Ну как, - говорят, - ты же в командировки там всякие ездишь, системки
отлаживать?
- Ну...
- Так вот, сюда трусики положишь, сюда носочки, сюда...
- Стоп, стоп, ребята! А в чем же я сам поеду?
***
Заходит новый русский к
провайдеру и говорит:
- Мне мой компьютерщик сказал, у вас узнать -...начинает искать по
карманам... ничего не находит)... - ну, там было что-то про задницу три
раза и адрес! Набирает на мобильнике свой офис. Все, затаив дыхание,
ждут факса с запросом, через пару минут вылазиит бумага, а там:
"Пришлите, пожалуйста, адрес вашего РОР3 сервера."
***
cантехник ковыряется в
унитазе. Прочищает засор типа... Вдруг замечает, что за ним наблюдает
мальчик.
- Что мальчик, неприятно? Это тебе, панимашшь, не в Интернете
копаться...
***
Лена: А
у нас вчера под окнами hЛО висело... Хакер(злобно, не отрываясь от
компьютера):
-Кто ж его под "окнами" ставит, надо было под linux, тагда б не
зависло...
***
Ходят 2 подружки по
магазинам модной одежды. Зашли в один и просят продавца помочь подобрать
прикид. Он:
-Какой у вас размер?
-Рост 170, вес 60, 90-60-90, размер груди 3, волосы... Вторая:
-Анька, очнись, ты не в icq!!!
Если у вас есть желание
поделиться своим опытом с читателями, вы являетесь обладателем ценных,
интересных статей или авторских программ, а может вы просто хотите высказать свое мнение или
замечание о рассылке, просто
напишите мне. Я
постараюсь уделить внимание каждому. А "Клуб
программистов" всегда рад приветствовать в своих рядах новых
пользователей.