2015-07-23 3 views
0

У меня есть служба C#, это сервер веб-сокетов. Когда соединение с веб-сокетом получено, я получаю идентификатор процесса подключающего приложения (Chrome) из сокета, а затем получаю идентификатор сеанса этого процесса. Получение идентификатора процесса и идентификатора сеанса выполняется в dll C++, который загружается службой C#.ProcessIdToSessionId возвращает неверный идентификатор сеанса

Глядя на вкладке Процессы в диспетчере задач я вижу запись для chrome.exe с PID в 5640 и идентификатор сеанса 45.

в DLL C++ я использую GetExtendedTcpTable(), чтобы найти процесс ID из порта. Это, похоже, отлично работает, когда я получаю правильный идентификатор процесса (в моем примере PID - 5640). Однако, когда я использую этот идентификатор процесса в ProcessIdToSessionId(), идентификатор сеанса возвращается в 44 раза!

Почему ProcessIdToSessionId() возвращает неверный идентификатор сеанса?

ОС Windows 7 32bit.

ответ

0

Только что обнаружил проблему! Я использовал функцию обертки для вызова ProcessIdToSessionId(). Эта функция была написана для приложения, которое было запущено в сеансе, поэтому оно оптимизировано только для получения идентификатора сеанса один раз и сохранения его внутри. Идея этого заключалась в том, что нет необходимости повторно запрашивать идентификатор сеанса из текущего процесса, поскольку идентификатор сеанса никогда не изменится. Поэтому, когда функция была вызвана впоследствии, она снова не вызывала ProcessIdToSessionId(), но возвращала сохраненное значение.

Конечно, повторно используя эту функцию в службе, которая вызывается из разных сеансов, получен правильный идентификатор сеанса при первом вызове, но последующие вызовы получили неправильный идентификатор сеанса. Изменение функции обертки для принудительного повторного запроса идентификатора сеанса устранило проблему.

Смежные вопросы