MarshalS Ответов: 1

Код C++ для печати всего процесса с идентификатором сеанса


У меня есть код c++ для отображения всего процесса с идентификатором сеанса , но этот код не работает идеально на некоторых машинах Windows xp, из-за методов ProcessIdToSessionId() минимальная поддержка-Windows Vista. У кого-нибудь есть предложения о том, как это сделать для Windows XP. Вот мой код

Что я уже пробовал:

#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    std::wstring wsProcessName;
    DWORD dwSessionId,dwPid,dwErr;
    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            dwPid = entry.th32ProcessID;
            wsProcessName = entry.szExeFile;
            if(!ProcessIdToSessionId(dwPid,&dwSessionId))
            {
                dwErr = GetLastError();
                std::wcout<<"Error " << wsProcessName.c_str()<<"\t"<<entry.th32ProcessID<<"\t"<<entry.th32ModuleID<<"\t"<<dwErr<<"\n";
            }
            else
                std::wcout<<wsProcessName.c_str()<<"\t"<<entry.th32ProcessID<<"\t"<<dwSessionId<<"\n";
            dwSessionId = NULL;
            dwErr = NULL;
        }
    }
    CloseHandle(snapshot);
    return 0;
}

Richard MacCutchan

Если функция не поддерживается в Windows XP, то она не поддерживается и в Windows XP. Нет никакого решения.

MarshalS

если этот API не поддерживается в windows XP, я спросил, есть ли другие способы его найти.

1 Ответов

Рейтинг:
6

Jochen Arndt

Цитата:
из-за методов ProcessIdToSessionId() минимальная поддержка-Windows Vista
Это из фактической документации MSDN. Поскольку Windows XP больше не поддерживается, она удаляется из документации.

Если вы хотите поддерживать XP (или даже более старые версии Windows), вам следует использовать более старую документацию SDK. Из SDK платформы 2003 года:
Цитата:
ProcessIdToSessionId
...
Клиент: входит в состав Windows XP и Windows 2000 Professional.
Сервер: входит в состав Windows Server 2003 и Windows 2000 Server.
Распространяемый: требуется Terminal Server 4.0 SP4 в Windows NT 4.0 SP4.
Заголовок: объявлен в Winbase.h; включает Windows.h.
Библиотека: используйте Kernel32. lib

При использовании не поддерживаемой функции программа немедленно прекращает выполнение с соответствующим сообщением об ошибке.

Должна быть и другая причина, если функция работает не так, как ожидалось в XP. Но опять же старый SDK может иметь ключ к разгадке:
Цитата:
Замечания
Если вызывающий процесс не выполняется в среде служб терминалов, то значение, возвращаемое в pSessionId, равно нулю