Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.02.22;
Скачать: CL | DM;

Вниз

Воспользоваться занятым портом.   Найти похожие ветки 

 
Дмитрий СС   (2014-07-17 23:13) [0]

Есть две программы:
1. программа A постоянно работает. При этом постоянно держит открытым ком-порт (пусть COM1)
2. программа Б запускается время от времени (оператором) и ей тоже требуется работа с портом COM1.

Необходимо ставить на паузу программу А (например с помощью SuspendThread всех ее потоков). Освобождать порт, а затем, когда программа Б поработает возвращать порт обратно.

Windows XP, админские права имеются.
Насколько это реально?


 
Cobalt ©   (2014-07-17 23:35) [1]

Только если научить их этому кунштюку.


 
Юрий Зотов ©   (2014-07-17 23:46) [2]

Вариант навскидку. Наверное, не самый лучший, но работать должен.

Б посылает А сообщение с1. Получив с1, А освобождает порт и посылает Б сообщение с2. Получив с2, Б работает с портом и, закончив, посылает А сообщение с3. Получив с3, А снова захватывает порт.

По сути, речь идет о синхронизации 2-х программ, поэтому другой вариант - использовать системные объекты синхронизации.


 
Германн ©   (2014-07-17 23:59) [3]


> Необходимо ставить на паузу программу А (например с помощью
> SuspendThread всех ее потоков). Освобождать порт

Если программа А не твоя, отобрать порт у нее ты сможешь только через её труп.


 
Дмитрий СС   (2014-07-18 00:07) [4]

P.S. Обе программы не мои:)


> Германн ©   (17.07.14 23:59) [3]
>

В том то и проблема.
Если бы программа Б была моей - можно было бы поставить на паузу А, а затем просто воспользоватся ее дескриптором в ее же контексте (дополнительным потоком, например). Но программа Б тоже не моя.


 
ВладОшин ©   (2014-07-18 00:37) [5]

virtualPort была программка в свое время. Там класс их был таких целый
не помню точно про что - погугли, может подойдет. Какое-то маппирование виртальных портов на реальный можно было сделать, емнип

А не твоя, Б тоже не твоя..
а порт арендуешь на виртуалке в Астралии? :))


 
Дмитрий СС   (2014-07-18 01:30) [6]


> ВладОшин ©   (18.07.14 00:37) [5]

Это слишком сложно)) да и помню я эти програмки - глючили они, к сожалению((

А как вам такая идея:
1. Находим процесс программы А, останавливаем (syspend) его (чтобы ничего не писал и не читал из порта).
2. Находим хендл нужного порта (не очень сложно).
3. Запускаем программу Б и перекрываем ей функцию CreateFile так, чтобы она возвращала копию хендла (DuplicateHandle) полученного на этапе 2.
4. ждем пока Б закончит, восстанавливаем работу А (resume).

Все счастливы, А жива, продолжает работать с портом)


 
Германн ©   (2014-07-18 01:45) [7]


> Запускаем программу Б и перекрываем ей функцию CreateFile
> так, чтобы она возвращала копию хендла (DuplicateHandle)
> полученного на этапе 2.

ОС тебе даст отлуп на этот хэндл, имхо.
Так что только через виртуальные порты может что и получится.


 
картман ©   (2014-07-18 03:55) [8]


> Дмитрий СС   (18.07.14 01:30) [6]
>
>
> > ВладОшин ©   (18.07.14 00:37) [5]
>
> Это слишком сложно)) да и помню я эти програмки - глючили
> они, к сожалению((
>
> А как вам такая идея:
> 1. Находим процесс программы А, останавливаем (syspend)
> его (чтобы ничего не писал и не читал из порта).
> 2. Находим хендл нужного порта (не очень сложно).

не поделишься, как?


 
имя   (2014-07-18 10:07) [9]

Удалено модератором


 
Дмитрий СС   (2014-07-18 11:13) [10]


> ОС тебе даст отлуп на этот хэндл, имхо.

Вот и проверю. Но я верю в лучшее :)


> не поделишься, как?

В интернете пример нашёл. Правда медленный, но работает.


 
Дмитрий СС   (2014-07-18 14:21) [11]

Кстати, как сама windows быстро узнает, что ресурс (тот же ком порт) занят?


 
Игорь Шевченко ©   (2014-07-18 14:31) [12]

Дмитрий СС   (18.07.14 14:21) [11]

Так же, как узнает, что занят открытый файл. COM-порт тот же файл


 
Дмитрий СС   (2014-07-18 14:56) [13]


> Так же, как узнает, что занят открытый файл. COM-порт тот
> же файл

Так а как?


 
junglecat   (2014-07-18 15:01) [14]

> Так а как?

инфа об открытых хэндлах есть же в системе, режим разделения доступа тоже


 
Дмитрий СС   (2014-07-18 16:54) [15]


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

Единственный способ который я пока нашел - подразумевает создание отдельного потока для каждого хендла для получения имени ресурса, а иначе может все повиснуть на NtQueryObject. Можно немного оптимизировать, но тем не менее не думаю что система при открытии файла вообще создает отдельные потоки.

Я не хочу создавать потоки, и ищу обходные пути, пока не нашел.


 
junglecat   (2014-07-18 17:02) [16]

> [15] Дмитрий СС   (18.07.14 16:54)

система не создает потоки на открытие файла. Другое дело, что ком-порт в винде всегда открывается в монопольном доступе.
Поэтому тут только синхронизация между процессами


 
Игорь Шевченко ©   (2014-07-18 17:21) [17]


> Так а как?


По отрицательному результату функции CreateFile и коду ошибки ERROR_SHARING_VIOLATION ?


 
Дмитрий СС   (2014-07-18 17:57) [18]


> Игорь Шевченко ©   (18.07.14 17:21) [17]

А как windows определяет что нужно вернуть ERROR_SHARING_VIOLATION?


 
Inovet ©   (2014-07-18 18:48) [19]

> [18] Дмитрий СС   (18.07.14 17:57)

А кто должен знать если не Виндоус, что там у неё в хозяйстве творится.


 
Игорь Шевченко ©   (2014-07-18 18:51) [20]


> А как windows определяет что нужно вернуть ERROR_SHARING_VIOLATION?


Смотрит в список открытых файлов, ищет по имени, сравнивает атрибуты соместного доступа, если находит.


 
Дмитрий СС   (2014-07-18 19:10) [21]


> А как вам такая идея:
> 1. Находим процесс программы А, останавливаем (syspend)
> его (чтобы ничего не писал и не читал из порта).
> 2. Находим хендл нужного порта (не очень сложно).
> 3. Запускаем программу Б и перекрываем ей функцию CreateFile
> так, чтобы она возвращала копию хендла (DuplicateHandle)
> полученного на этапе 2.
> 4. ждем пока Б закончит, восстанавливаем работу А (resume).
>
>
> Все счастливы, А жива, продолжает работать с портом)


Идея сработала. Я получаю живой рабочий указатель на порт, могу с ним работать, приложение А при восстановлении ничего не замечает. НО.

Приложение А использует FILE_FLAG_OVERLAPPED, а Б - нет. В итоге Б получает постоянные ошибки INVALID_PARAMETER, т.к. не передает Overlapped структуру.
Что с этим делать - пока не знаю.


 
Дмитрий СС   (2014-07-18 19:19) [22]

Может есть способ изменить (и получить) флаг FILE_FLAG_OVERLAPPED у открытого файла?

Не хочется еще перехватывать ReadFile и WriteFile у Б и реализовывать там прокси.


 
Игорь Шевченко ©   (2014-07-19 00:06) [23]


> Может есть способ изменить (и получить) флаг FILE_FLAG_OVERLAPPED
> у открытого файла?


Может, задачу можно решить более гуманным способом ?


 
Германн ©   (2014-07-19 02:04) [24]


> Идея сработала. Я получаю живой рабочий указатель на порт,
>  могу с ним работать

Не верю.


 
Германн ©   (2014-07-19 02:06) [25]


> Идея сработала. Я получаю живой рабочий указатель на порт,
>  могу с ним работать

Не верю.


 
Германн ©   (2014-07-19 02:11) [26]

Форум опять глючит.

"Не верю" не относится к работе с хэндлом. Это относится к работе с портом.
И к твоим выводам, что проблема в FILE_FLAG_OVERLAPPED. Но удачи в дальнейшем поиске!


 
Дмитрий СС   (2014-07-19 02:46) [27]

D
> Это относится к работе с портом.

Так проверь. Или поверь.

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


> Может, задачу можно решить более гуманным способом ?

Я просто упростил задачу. И того чтотя сделал хватило. Кстати я кажется использовал ваши наработки найденные в сети, за что вам премного благодарен !



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

Текущий архив: 2015.02.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.005 c
11-1257949541
RusSun
2009-11-11 17:25
2015.02.22
минимизация окна


2-1390291002
AlexDn
2014-01-21 11:56
2015.02.22
Запуск странички


15-1405369802
Юрий
2014-07-15 00:30
2015.02.22
С днем рождения ! 15 июля 2014 вторник


11-1257358925
stas
2009-11-04 21:22
2015.02.22
KOL отправка почты


3-1299227533
Junior
2011-03-04 11:32
2015.02.22
Поиск текста