Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];

Вниз

Использование COM-порта нескролькими приложениями   Найти похожие ветки 

 
Alex_C   (2009-11-05 13:34) [0]

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


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

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


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

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

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

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

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


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


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


Да.

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

hTargetProcessHandle

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

lpTargetHandle

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:45) [4]

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

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


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

А это условие

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

обеспечил ?


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

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


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

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


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


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


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

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


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


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


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


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


> Alex_C   (10.11.09 13:14) [8]


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

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


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


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


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


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


> Alex_C   (11.11.09 09:54) [11]

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


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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
15-1327780944
wl
2012-01-29 00:02
2012.06.03
фарма


15-1327573619
>|<
2012-01-26 14:26
2012.06.03
Как правильно обновляться программу


15-1327771468
Хаус
2012-01-28 21:24
2012.06.03
Как повысить скорость чтения?


15-1328106469
yurikon
2012-02-01 18:27
2012.06.03
Нужна помощь по COM объекту


2-1327909072
jacksotnik
2012-01-30 11:37
2012.06.03
потеря управления контрола





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский