在启动期间从服务调用WTSFreeMemory时挂起-我应该忽略吗?

时间:2019-10-25 11:24:26

标签: c++ winapi service

当我的服务在启动时由系统启动时,其状态将保持为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);
}

1 个答案:

答案 0 :(得分:0)

这是我自己的一个错误:我修改了WTSEnumerateSessionsW返回的指针(请参见代码中的sessionData++),因此将无效的地址传递给了WTSFreeMemory()。 / p>

感谢RbMm的帮助。