Anonymous pipe - ы
От: 3V Россия  
Дата: 08.05.03 01:50
Оценка:
Я пытаюсь осуществить передачу данных между процессами с помощъю
Anonymous Pipe (поскольку требуется, чтобы программа работала во всех виндах). Причем процесс — клиент не должен являться дочерним процессом сервера. Для передаче хендла для записи информации, полученного при вызове CreatePipe в процессы — клиенты я использую общую (shared) секцию памяти в dll, загружаемой и сервером и клиентами.
В нынешнем состоянии значение этого хендла совпадает на стороне сервера и клиента.
При всем при этом чтение на стороне сервера проходит успешно (поток виснет на ReadFile), а вот вызов WriteFile на стороне клиента заканчивается неудачей.
Значение GetLastError = 6 (ERROR_INVALID_HANDLE). Я пробовал менять мозги сервера и клиента местами (сервер пишет, клиент читает). В этом случае запись (опять же на стороне сервера, где Pipe и создавался) проходит успешно, а вот клиент читать не может. И та же GetLastError = 6. В MSDN утверждается, что передачу хендла в другой процесс через общую память в данном случае использовать можно. Но все примеры MSDN основаны на передаче хендла от родительского процесса дочернему.
Не подскажет ли кто возможные пути решения проблемы ?


Заранее благодарен. С уважением, Vic.
Re: Anonymous pipe - ы
От: MBo  
Дата: 08.05.03 01:58
Оценка:
3V>Anonymous Pipe (поскольку требуется, чтобы программа работала во всех виндах). Причем процесс — клиент не должен являться дочерним процессом сервера. Для передаче хендла для записи информации, полученного при вызове CreatePipe в

Используй DuplicateHandle
Re: Anonymous pipe - ы
От: _kin_ Россия  
Дата: 08.05.03 10:16
Оценка:
Здравствуйте, 3V, Вы писали:

3V> Я пытаюсь осуществить передачу данных между процессами с помощъю

3V>Anonymous Pipe (поскольку требуется, чтобы программа работала во всех виндах). Причем процесс — клиент не должен являться дочерним процессом сервера. Для передаче хендла для записи информации, полученного при вызове CreatePipe в процессы — клиенты я использую общую (shared) секцию памяти в dll, загружаемой и сервером и клиентами.
3V>В нынешнем состоянии значение этого хендла совпадает на стороне сервера и клиента.
3V>При всем при этом чтение на стороне сервера проходит успешно (поток виснет на ReadFile), а вот вызов WriteFile на стороне клиента заканчивается неудачей.
3V>Значение GetLastError = 6 (ERROR_INVALID_HANDLE). Я пробовал менять мозги сервера и клиента местами (сервер пишет, клиент читает). В этом случае запись (опять же на стороне сервера, где Pipe и создавался) проходит успешно, а вот клиент читать не может. И та же GetLastError = 6. В MSDN утверждается, что передачу хендла в другой процесс через общую память в данном случае использовать можно. Но все примеры MSDN основаны на передаче хендла от родительского процесса дочернему.
3V> Не подскажет ли кто возможные пути решения проблемы ?


3V> Заранее благодарен. С уважением, Vic.


Анонимные пайпы будут работать только с дочерними процессами. Нельзя передавать HANDLE из одного поцесса в
другой, т.к. он существует только в контексте процесса, который его создал. Исключением является наследование
HENDLE дочерним процессом.

Так что в данной задаче надо искать другой способ IPC (например через dll с shared секцией).
Re[2]: Anonymous pipe - ы
От: MBo  
Дата: 08.05.03 13:38
Оценка: 6 (1)
__>Анонимные пайпы будут работать только с дочерними процессами. Нельзя передавать HANDLE из одного поцесса в
__>другой, т.к. он существует только в контексте процесса, который его создал. Исключением является наследование
__>HENDLE дочерним процессом.

__>Так что в данной задаче надо искать другой способ IPC (например через dll с shared секцией).


из Рихтера:Существует три способа совместного использование объектов ядра:

1) Наследование описателя объекта (для дочерних процессов)
2) Именованные объекты
3) Дублирование описателей объектов (DuplicateHandle)

первые два способа отпадают, а третий для данного случая вполне подходит.
Надо только узнать или передать (MMF, сообщением, dll) идентификаторы процессов и из сервера дескрипторы для дублирования.

Хотя IMHO, именованный MMF в использовании проще пайпов.
Re[3]: Anonymous pipe - ы
От: 3V Россия  
Дата: 08.05.03 17:56
Оценка:
Здравствуйте, MBo, Вы писали:

__>Анонимные пайпы будут работать только с дочерними процессами. Нельзя передавать HANDLE из одного поцесса в

__>другой, т.к. он существует только в контексте процесса, который его создал. Исключением является наследование
__>HENDLE дочерним процессом.

__>Так что в данной задаче надо искать другой способ IPC (например через dll с shared секцией).


MBo>из Рихтера:Существует три способа совместного использование объектов ядра:


MBo>1) Наследование описателя объекта (для дочерних процессов)

MBo>2) Именованные объекты
MBo>3) Дублирование описателей объектов (DuplicateHandle)

MBo>первые два способа отпадают, а третий для данного случая вполне подходит.

MBo>Надо только узнать или передать (MMF, сообщением, dll) идентификаторы процессов и из сервера дескрипторы для дублирования.

MBo>Хотя IMHO, именованный MMF в использовании проще пайпов.


Задача решена.
Как и посоветовал MBo, я передал через длл — ку идентификатор процесса сервера
в клиент (кроме хендла, созданного CreatePipe). В клиенте сделал
OpenProcess с параметром PROCESS_DUP_HANDLE, получив хендл процесса сервера,
затем сдублировал DuplicateHandle переданный с сервера хендл. Через него и пишем.
Все работает.

Всем спасибо !

С уважением, Vic.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.