当我的服务在启动时由系统启动时,其状态将保持为SERVICE_START_PENDING
一段时间,然后终止(或者终止,我不知道)。如果我在系统启动时手动启动该服务,则一切正常。
在寻找原因的过程中,我发现某处发生某事 WTSFreeMemory(仅供参考:我想检查用户当前是否通过WTSEnumerateSessions登录)-该函数永不返回。除此之外,只有在没有用户登录时,这种情况才会发生。
现在我对WTSFreeMemory的使用感到困惑。目前,我最多可以省略WTSFreeMemory
(至少对于没有用户以交互方式登录的情况)-但这会导致内存泄漏,不是吗? “备份”指针并稍后使用WTSFreeMemory也不是一个好的解决方案,因为“寻找交互式用户”可能会发生多次(当用户登录或注销时,我会收到通知)。
对于文档没有(明确)说明的WTSFreeMemory,您有什么建议吗?以前非常感谢。
// Look if the user is the interactive user
WTS_SESSION_INFOW *sessionData = nullptr;
DWORD numSessions;
DWORD sessionId = static_cast<DWORD>(UTILS_GENERIC_FAILURE);
if (!WTSEnumerateSessionsW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessionData, &numSessions))
{
return (UTILS_GENERIC_FAILURE);
}
for(quint32 loop = 0; loop < numSessions; loop++, sessionData++)
{
if (sessionData->State == WTSActive)
{
sessionId = sessionData->SessionId;
break;
}
}
// Calling WTSFreeMemory hangs for some reason if currently no user is logged on
if (sessionData)
{
WTSFreeMemory(sessionData);
}
答案 0 :(得分:0)
这是我自己的一个错误:我修改了WTSEnumerateSessionsW
返回的指针(请参见代码中的sessionData++
),因此将无效的地址传递给了WTSFreeMemory()
。 / p>
感谢RbMm的帮助。