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

Вниз

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

 
Дмитрий СС   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.002 c
15-1405587956
ВладОшин
2014-07-17 13:05
2015.02.22
Вопрос про шахматы на сайте. Догадка о силе игры


11-1257949541
RusSun
2009-11-11 17:25
2015.02.22
минимизация окна


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


11-1258441577
Dy1
2009-11-17 10:06
2015.02.22
апи Windows 7


15-1405624412
Дмитрий СС
2014-07-17 23:13
2015.02.22
Воспользоваться занятым портом.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский