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

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

Использование COM-порта нескролькими приложениями [D7, WinXP]


Alex_C ©   (2009-11-05 13:34:00) 

Можно ли использовать один и тот же ком-порт одновременно несколькими приложениями?
Допустим так: основное приложение открывает ком-порт. В случае необходимости запускает другое приложение, передавая ему хендл ком-порта?


Alex_C   (2009-11-11 13:30:00) [1]

В итоге хочу выразить очередную БОЛЬШУЮ благодарность Сергею М. - все сделал, все отлично заработало!


Вариант   (2009-11-11 10:29:00) [2]


> Alex_C   (11.11.09 09:54) [11]

Зачем же переходник. Хотя тоже вариант, но есть и другие варианты. Технология клиент-сервер например.


Alex_C   (2009-11-11 09:54:00) [3]


> И мне кажется идея разделения порта между приложениями не
> очень удачна.


Более чем неудачна, но это требование заказчика, тем более что заказчик видел, что в другой программе это реализовано :)
Собственно есть 2 оборудования, управляемые по ком-порту, причем одно сигналами RTS/DTR, другое - Rx/TX. Т.е. через один ком-порт (а в современных компах и ноутах он в лучшем случае 1 и есть) ими можно управлять. Когда это было все в одной прграмме - все работало без проблем.  А вот сейчас стала задача сделать в разных процессах. Переходники USB-COM не предлагать :)


Вариант   (2009-11-10 14:30:00) [4]


> Alex_C   (10.11.09 13:14) [8]


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

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


Сергей М.   (2009-11-10 13:23:00) [5]


> собираюсь передавать через PostMessage - вродебы так привильно?


Правильным будет любой вариант, в котором передаваемый адрес валиден в момент последующего вызова DuplicateHandle


Alex_C   (2009-11-10 13:14:00) [6]


> Целевое приложение должно тем или иным образом выделить
> в своем адресном пространстве блок памяти под хэндл и тем
> или иным образом передать адрес этого блока в приложение-
> источник,


Я собираюсь передавать через PostMessage - вродебы так привильно?

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


Сергей М.   (2009-11-06 14:50:00) [7]

Целевое приложение должно тем или иным образом выделить в своем адресном пространстве блок памяти под хэндл и тем или иным образом передать адрес этого блока в приложение-источник, чтобы оно могло подставить этот адрес фактическим параметром lpTargetHandle.


Alex_C   (2009-11-06 14:32:00) [8]

Гм... А вот эта фраза мне честно говоря совсем не понятна. И нигде в примерах ничего подобного не объясняется.


Сергей М.   (2009-11-05 15:02:00) [9]

А это условие

> This handle value is valid in the context of the target
> process

обеспечил ?


Alex_C   (2009-11-05 14:45:00) [10]

Спасибо еще раз!
Разобрался!
Надо так сначала

idCW := GetProcessId(Куда будем передавать hPortDup);
hCW := OpenProcess(PROCESS_DUP_HANDLE, false, idCW);
DuplicateHandle(GetCurrentProcess, hPort, hCW, @hPortDup, 0, TRUE, DUPLICATE_SAME_ACCESS);


Сергей М.   (2009-11-05 14:30:00) [11]


> открываю ком-порт
> hPort := CreateFile(...;
>
> Затем делаю его дубликат


Да.

Но (!!) читай внимательно, эбо это крайне важно:

h TargetProcessHandle

Identifies the process that is to receive the duplicated handle. The handle must have PROCESS_DUP_HANDLE access.

lp TargetHandle

Points to a variable receiving the value of the duplicate handle. This handle value is valid in the context of the target process. If lpTargetHandle is NULL, the function duplicates the handle, but does not return the duplicate handle value to the caller.


Alex_C   (2009-11-05 14:13:00) [12]

То Сергей М. Большое спасибо!
Правильно ли я понял:

В основной программе я открываю ком-порт
hPort := CreateFile(...;

Затем делаю его дубликат
DuplicateHandle(GetCurrentProcess, hPort,
  GetCurrentProcess, @hPortDup, 0, TRUE, DUPLICATE_SAME_ACCESS);

И вот уже hPortDup каким то образом передаем в другое приложение?


Сергей М.   (2009-11-05 13:39:00) [13]

Можно.
см. DuplicateHandle()


Наверх

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