Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Типа передача данных первой копии программы от второй [D6, WinXP]


Страницы:   1 2

NailMan ©   (2003-10-01 12:19:00) 

Необходимо передать данные(до нескольких килобайт) первому экземпляру программы от других вторичных экземпляров.

Сам алгоритм передачи сделал по принципу клиент-сервер, а именно:
Первая копия при запуске входит в режим сервера и собсно работает с юзером(это видеоплеер). Последующие копии, до создания всех форм определяют наличие сервера и входят в режим клиента, тоесть начинают процедуру передачи параметров(предварительно зарегистрировав в системе соответсвующие сообщения).

Реализовал это так:

Процедура (у клиента) передачи пайпа серверу
Procedure ProcessTransmitParameters;
var Msg : TMsg;
s:shortstring;
i:integer;
begin
nuldd:=0;
//Циклически посылаем сообщение о желании передать пайп до тех
//пор пока сервер не ответит о готовности принять пайп от клиента
//сервер посылает о занятости если уже работает с другим клиентом
repeat
Postmessage(FirstInstanceHandle, PIPE_GETHANDLE, Application.Handle, 0);
waitmessage;
PeekMessage(msg,Application.handle,0,0,PM_REMOVE);
until msg.message=PIPE_READY;

//пишем данные в пайп
//пишем в пайп число параметров коммандной строки
<Запись cParamcount>
For i:=1 to cParamcount do
begin
s:=paramstr(i);
//Запись в пайп самого параметра коммандной строки из shortstring
<Запись из буфера s, 256 байт>
end;
//Посылаем хэндл пайпа серверу
Postmessage(FirstInstanceHandle,PIPE_TAKEHANDLE,PipeRHandle,0);

//Ожидаем получения подтверждения от сервера, о том что данные пайпа обработаны.
repeat
waitmessage;
GetMessage(msg,Application.handle,0,0);
until msg.message=PIPE_HANDLED;
//Со спокойной душой идем на завершение работы программы
end;


Далее как сделано на сервере:

Сделал левый объект:
TYPE
TWindowHandler = CLASS
procedure OnMessage(var Msg: TMsg; var Handled: Boolean);
END;


И в начале программы, до создания форм метод Application.OnMessage заменяю на TWindowHandler.OnMessage, тоесть
Application.OnMessage:=WindowHandler.OnMessage;
(в принципе клиент это тоже делает, но после этого он проваливается в режим клиента)

Далее сервер грузится нормальным образом(создает формы и проваливается в Applicarion.run)

Вот что содержит обработчик(TWindowHandler.OnMessage) на приеме уже самого хэндла пайпа(остальное не интересует нас):


If (msg.message=PIPE_TAKEHANDLE) then
begin
RemotePipeHandle:=msg.wParam;
<Читаем число строк данных из пайпа>
For i:=1 to c do
begin
<Читаем сами строки>
PlayList.AddFile(s);
end;
//репортуем что данные обработали
postmessage(RemoteInstanceHandle,PIPE_HANDLED,0,0);
Pipe_Blocked:=False; //разблокируем себя для приема запросов от других клиентов
end;


Собсно система работает гладко(сам алгоритм передачи), но не получается перенести сами данные.

Пробовал использовать CreateFileMapping для создания временного файла, который создавался на каждой копии программы, но как видно из вышеприведенного кода заполнялся данными на клиенте. Хэндл передается серверу существующим(<>0), но при попытке сервером считать в обработчике из него данные при помощи FileRead(WinAPIшного ессно), то даные оттуда не вынимаются, тоесть число считаных байт возвращается нулевым и в переменной "C" тоже ничего нет нужного. В цикл считывания самих строк он ессно не входит.

Пробовал делать просто пайп CreatePipe, но при попытке чтения сервером данных, на клиенте вылетал AV(клиент был запущен отдельно из проводника, а сервер я пошагово отрабатывал в дельфе).

Вобщем каким способом наиболее безопасно передать эти данные, так как заранее не извесно в какой ОС будет работать программа(NT, 9x)? Чую задницей, какой то подвох со стророны прав доступа сервера к этим данным клиента. Нужен универсальный способ, чтоб работал и в w2k/xp и в 9x/me без гемора.

Создавать на винте не предлагать - не по взрослому имхо. Да и в один момент на сервер могут ломиться сразу несколько копий программы - юзер выделил в проводнике несколько файлов AVI и запустил открытие моей прогой(расширение уже зарезервировано в системе на мою прогу) и все они хотят отдать уже запущенному серверу(или первой запущенной программе из этого списка, которая стала сервером первой). Вот и логично все это дело передавать через память, но что-то путевого на это счет придумать не могу.

Вобщем нид хелп.


NailMan   (2003-10-01 12:21:00) [21]

Да забыл сказать!

Создание временного файла посредством CreateFileMapping брал из местного FAQ из статьи про определение загруженной копии приложения.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо