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

问题描述 投票:0回答:1

[我的服务在启动时由系统启动时,其状态在一段时间内保持为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);
}
c++ winapi service
1个回答
0
投票

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

感谢RbMm的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.