VC中查找進程的二種方法


在工作中,經常會遇到這種情況:

  先判斷自己需要的某個模塊是否啟動,如果沒有啟動,那么就啟動它。

  有時候需要殺掉某個進程,都需要用到進程的枚舉。

如下提供兩種查找進程的方法。

1. 采用進程快照枚舉進程的方法查找指定名稱進程

BOOL FindProcessByName(LPCTSTR szFileName, PROCESSENTRY32& pe)
{
    // 采用進程快照枚舉進程的方法查找指定名稱進程
    HANDLE hProcesses;
    PROCESSENTRY32 lpe =
    {
        sizeof(PROCESSENTRY32)
    };
    CString strFileName(szFileName);
    strFileName.MakeLower();

    // 創建進程快照
    hProcesses = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcesses == INVALID_HANDLE_VALUE)
        return FALSE;
    // 獲取第一個進程實例
    BOOL isExist = ::Process32First(hProcesses, &lpe);
    BOOL isRunning = FALSE;
    CString strName;
    while (isExist)
    {
        strName = lpe.szExeFile;
        strName.MakeLower();
        if (-1 != strFileName.Find(strName))
        {
            isRunning = TRUE;
            break;
        }
        // 遍歷下一個進程實例
        isExist = ::Process32Next(hProcesses, &lpe);
    }

    if (isRunning)
    {
        memcpy(&pe, &lpe, sizeof(PROCESSENTRY32));
    }

    CloseHandle(hProcesses);

    return isRunning;
}

 

2. 直接枚舉進程

BOOL FindProcessByName(LPCTSTR szFileName)
{
    /************************************************************************/
    // 采用直接枚舉進程的方法查找指定名稱進程
    /* 名    稱: FindProcessByName( LPCTSTR szFileName )
    /* 功    能: 查詢指定名稱的進程是否有實例正在運行
    /* 參  數: LPCTSTR szFileName, 可執行程序名稱, 例如"c:\\notepad.exe"
    /* 返 回 值: BOOL.TRUE, 有同名實例正在運行; FALSE, 沒有同名實例正在運行.
    /* 編 寫 者: Xianren Li
    /* 創建日期: 2007-08-17
    /* 附加說明: 請注意進程的查找只是依據名稱, 無法確保找到的進程調用的是預料
    /*             中的可執行文件.
    /* 修改記錄:
    /************************************************************************/

    CString strFileName(szFileName);
    strFileName.MakeLower();

    DWORD aProcesses[1024], cbNeeded, cProcesses;

    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
        return FALSE;

    cProcesses = cbNeeded / sizeof(DWORD);

    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
    HANDLE hProcess;
    CString strName;
    BOOL isRunning = FALSE;
    for (unsigned int i = 0; i < cProcesses; i++)
    {
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);

        if (NULL != hProcess)
        {
            HMODULE hMod;
            DWORD cbNeeded;

            if (::EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
            {
                ::GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));
                strName = szProcessName;
                strName.MakeLower();
                if (-1 != strFileName.Find(strName))
                {
                    isRunning = TRUE;
                    CloseHandle(hProcess);
                    break;
                }
            }
            CloseHandle(hProcess);
        }
    }

    return isRunning;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM