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