Конференция "WinAPI" » Использование COM-порта нескролькими приложениями [D7, WinXP]
 
  • Alex_C (05.11.09 13:34) [0]
    Можно ли использовать один и тот же ком-порт одновременно несколькими приложениями?
    Допустим так: основное приложение открывает ком-порт. В случае необходимости запускает другое приложение, передавая ему хендл ком-порта?
  • Сергей М. © (05.11.09 13:39) [1]
    Можно.
    см. DuplicateHandle()
  • Alex_C (05.11.09 14:13) [2]
    То Сергей М. Большое спасибо!
    Правильно ли я понял:

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

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

    И вот уже hPortDup каким то образом передаем в другое приложение?
  • Сергей М. © (05.11.09 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 (05.11.09 14:45) [4]
    Спасибо еще раз!
    Разобрался!
    Надо так сначала

    idCW := GetProcessId(Куда будем передавать hPortDup);
    hCW := OpenProcess(PROCESS_DUP_HANDLE, false, idCW);
    DuplicateHandle(GetCurrentProcess, hPort, hCW, @hPortDup, 0, TRUE, DUPLICATE_SAME_ACCESS);
  • Сергей М. © (05.11.09 15:02) [5]
    А это условие

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

    обеспечил ?
  • Alex_C (06.11.09 14:32) [6]
    Гм... А вот эта фраза мне честно говоря совсем не понятна. И нигде в примерах ничего подобного не объясняется.
  • Сергей М. © (06.11.09 14:50) [7]
    Целевое приложение должно тем или иным образом выделить в своем адресном пространстве блок памяти под хэндл и тем или иным образом передать адрес этого блока в приложение-источник, чтобы оно могло подставить этот адрес фактическим параметром lpTargetHandle.
  • Alex_C (10.11.09 13:14) [8]

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


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

    Вообще суть чего мне надо добиться:
    есть основное приложение, которое работает с пользователем. И есть "служебное" скрытое от пользователя приложение, которое работает с ком-портом. Однако в некотором случае необходимо, чтоб и основное и служебное приложения могли работать с одним и тем же комп-портом.
    Взаимодействие между приложениями у меня осуществляется при помощи Messages.
    Предполагаю сделать так: перед открытием ком-порта, служебное приложение запрашивает у основного, использует ли оно ком- порт. Если нет - просто открывает его, если да - запрашивает хендл ком-порта у основного приложения и работает с ним.
  • Сергей М. © (10.11.09 13:23) [9]

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


    Правильным будет любой вариант, в котором передаваемый адрес валиден в момент последующего вызова DuplicateHandle
  • Вариант (10.11.09 14:30) [10]

    > Alex_C   (10.11.09 13:14) [8]


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

    В этом случае мне кажется достаточно попытаться открыть порт, получить ошибку, если он занят или продолжить с ним работу, если порт был успешно открыт...  И мне кажется идея разделения порта между приложениями не очень удачна.
    Хотя это мысли вслух, ибо всей задачи не знаю.
  • Alex_C (11.11.09 09:54) [11]

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


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

    > Alex_C   (11.11.09 09:54) [11]

    Зачем же переходник. Хотя тоже вариант, но есть и другие варианты. Технология клиент-сервер например.
  • Alex_C (11.11.09 13:30) [13]
    В итоге хочу выразить очередную БОЛЬШУЮ благодарность Сергею М. - все сделал, все отлично заработало!
 
Конференция "WinAPI" » Использование COM-порта нескролькими приложениями [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]