问题描述
根据the documentation,WTSFreeMemoryExA
可用于通过传递WTSTypeSessionInfoLevel1
的WTS_SESSION_INFO_1A
来释放WTS_TYPE_CLASS
结构。但是,任何尝试都会失败,错误代码为 87 (ERROR_INVALID_ParaMETER
,"The parameter is incorrect"
)。
如何让WTSFreeMemoryExA
工作?
解决方法
这似乎是 Windows 中的一个错误(至少在 Windows 10 版本 2004 中)。与文档相反,WTSFreeMemoryExA
函数不接受 WTSTypeSessionInfoLevel1
,而 WTSFreeMemoryExW
接受。这意味着不是使用返回 WTSEnumerateSessionsExA
结构的 WTS_SESSION_INFO_1A
函数,而是需要使用返回 WTSEnumerateSessionsExW
的 WTS_SESSION_INFO_1W
函数。
此错误实际上使 WTSEnumerateSessionsExA
无法使用,除非您不关心由于无法释放其结果而导致的内存泄漏。这个错误 appears 已经为人所知一段时间了。 (希望有一天,微软会解决这个问题。)
Some reports 声称即使使用 WTSEnumerateSessionsExW
和 WTSFreeMemoryExW
似乎也会泄漏内存,这意味着 WTSEnumerateSessions
与 WTSQuerySessionInformation
结合可能是 the better approach .但是,我自己一直无法重现该问题。我怀疑这曾经是一个真正的问题,但 Microsoft 在最近的 Windows 版本中已修复。
感谢您提出这个问题。
我们查看了相关源码,找到了与WTSFreeMemoryA
相关的源码。它接受第一个参数 WTSTypeClass
作为 WTSTypeProcessInfoLevel0
或 WTSTypeProcessInfoLevel1
,但它不接受值 WTSTypeSessionInfoLevel1
,因此在此调用中返回 ERROR_INVALID_PARAMETER
错误。
这与文档中的描述不同,我们将提交此问题。您可以尝试使用 WTSFreeMemoryW
来避免此问题。