ProcessIdToSessionId返回错误的会话ID

时间:2015-07-23 13:09:43

标签: c# c++ session

我有一个C#服务,它是一个Web套接字服务器。当收到Web套接字连接时,我从套接字获取连接应用程序(Chrome)的进程ID,然后我获得此进程的会话ID。 获取进程ID和会话ID是在C#服务加载的C ++ DLL中完成的。

查看任务管理器中的“进程”选项卡,我看到chrome.exe的条目,其PID为5640,会话ID为45。

在C ++ DLL中我使用GetExtendedTcpTable()从端口中查找进程ID。这似乎工作正常,因为我检索正确的进程ID(在我的示例PID是5640)。 但是,当我在ProcessIdToSessionId()中使用此进程ID时,返回的会话ID为44!

为什么ProcessIdToSessionId()会返回错误的会话ID?

操作系统是Windows 7 32位。

1 个答案:

答案 0 :(得分:0)

刚发现问题! 我使用包装函数来调用ProcessIdToSessionId()。此函数是为在会话中启动的应用程序编写的,因此它被优化为仅获取会话ID一次并在内部保存。这背后的想法是,没有必要从当前进程重新查询会话ID,因为会话ID永远不会改变。因此,当随后调用该函数时,它不会再次调用ProcessIdToSessionId(),而是返回存储的值。

当然,在从不同会话调用的服务中重用该函数会在其第一次调用时收到正确的会话ID,但后续调用会收到错误的会话ID。更改包装函数以强制重新查询会话ID可以解决问题。