[我的服务在启动时由系统启动时,其状态在一段时间内保持为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);
}
这是我自己的错误:我修改了WTSEnumerateSessionsW
返回的指针(请参见代码中的sessionData++
,因此将无效的地址传递给了WTSFreeMemory()
。
感谢RbMm的帮助。