首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Windows XP中获取正在执行的进程的完整路径

在Windows XP中获取正在执行的进程的完整路径
EN

Stack Overflow用户
提问于 2012-09-18 18:36:16
回答 1查看 3.9K关注 0票数 0

因此,我需要获取计算机上运行的进程列表,然后获取每个进程的完整路径。(我正在查找运行每个进程的文件夹)。我使用的是Vista http://msdn.microsoft.com/en-us/library/windows/desktop/ms684919(v=vs.85).aspx,然而,我只是发现这段代码需要在Windows XP上运行,并且函数的最低客户端是Vista。

那么有没有人知道另一种方法呢?

我试着使用GetModuleFileNameEx,但它就是不能工作。我会传入进程句柄,然后我在输出中得到的结果就是“ííí。

编辑:这是我使用GetModuleFileNameEx的尝试:

代码语言:javascript
运行
复制
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;
string name = procName;

// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
    REPORT_ERROR("CreateToolhelp32Snapshot (of processes): err=%d\n", ::GetLastError());
    return false;
}

// Set the size of the structure before using it.
pe32.dwSize = sizeof(pe32);

// Retrieve information about the first process,
// and exit if unsuccessful
if( !Process32First(hProcessSnap, &pe32))
{
    REPORT_ERROR("Process32First: err=%d\n", ::GetLastError());  // Show cause of failure
    CloseHandle(hProcessSnap);     // Must clean up the snapshot object!
    return false;
}
char pName[MAX_PATH];

//iterate through all processes
do {
    //Find start of files name
    char *szProcessFilename = strchr(pe32.szExeFile, '\\');
    if (szProcessFilename == NULL)
        szProcessFilename = pe32.szExeFile;
    else
        szProcessFilename++;    //Skip over last slash

    if (_stricmp(procName, szProcessFilename) == 0)
    {
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, false, pe32.th32ProcessID );
        char procLocationChar[MAX_PATH];
        DWORD exe_path_size = MAX_PATH;
        DWORD s = GetModuleFileNameEx(hProcess, NULL, pName, exe_path_size);

之后我做了更多的事情来获取路径,但是pName的值只是"ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ“

EN

回答 1

Stack Overflow用户

发布于 2012-09-18 18:49:38

要获取进程列表,可以使用PSAPI中的EnumProcesses函数。依次在生成的PID上使用OpenProcess,在它们的句柄上使用GetModuleFileNameEx来检索可执行文件名称。如下所示:

代码语言:javascript
运行
复制
const size_t maxPids = 1024;

std::set<std::wstring> processes;

DWORD pids[maxPids] = {};
DWORD bytesReturned = 0;

if (::EnumProcesses(pids, sizeof pids, &bytesReturned))
{
    DWORD cProcesses = bytesReturned / sizeof *pids;

    // set SeDebug privilege

    for (DWORD i = 0; i < cProcesses; i++)
    {
        DWORD pid = pids[i];

        if (HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid))
        {
            WCHAR filename[MAX_PATH] = {};

            if (::GetModuleFileNameEx(hProcess, NULL, filename, MAX_PATH))
            {
                processes.insert(filename);
            }
            else
            {
                // handle error
            }

            ::CloseHandle(hProcess);
        }
        else
        {
            // handle error
        }
    }

    // disable SeDebug privilege
}
else
{
    // handle error
}

请注意,有些进程无法打开(系统、空闲等)。您可能希望先对它们进行过滤,或者直接忽略错误。此外,根据系统环境的不同,您可能需要特殊权限才能打开非您创建的进程(SeDebugPrivilege),请参阅有关OpenProcess函数的文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12475284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档