Форум: "Прочее";
Текущий архив: 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