WTSFreeMemory зависает при вызове из службы во время запуска - я должен пропустить? - PullRequest
0 голосов
/ 25 октября 2019

Когда моя служба запускается системой при запуске, ее состояние некоторое время остается как 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...