본문 바로가기
코드 조각

Process 실행 체크 2

by 알 수 없는 사용자 2012. 4. 23.

바로 앞에 실행파일 체크 방법에는 문제점이 조금 있는데..


대소문자 구분 ,  

Process_name은 똑같지만 실행파일 경로가 다른 경우에 대한 제대로된 체크를 하지 못한다.


실행파일 경로까지 체크하는 프로세스 실행 체크 함수는...

  


//---------------------------------------------------------------------------
#include <tlhelp32.h>
#include "Psapi.h"
#pragma link "psapi.lib"
bool __fastcall IsRunProcessEx( AnsiString sFullExeName )
{

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnapshot,&pe32);
    AnsiString sExeName=ExtractFileName(sFullExeName).LowerCase();
    sFullExeName=sFullExeName.LowerCase();
    do
    {
        AnsiString sProcessExe = AnsiString(pe32.szExeFile).LowerCase();
        if(sExeName == sProcessExe )
        {
            HWND hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, pe32.th32ProcessID);
            if(hProcess)
            {
                char sBuf[MAX_PATH]={0};
                AnsiString sProcessPath;
                if( GetModuleNameEx(hProcess, NULL,sBuf, MAX_PATH)) sProcessPath=sBuf;
                CloseHandle(hProcess);
                sProcessPath=sProcessPath.LowerCase();
                if(sProcessPath == sFullExeName )
                {
                    CloseHandle(hSnapshot);
                    return true;
                }
            }
        }
    }
    while(Process32Next(hSnapshot,&pe32));

    CloseHandle(hSnapshot);

    return false;
}

     


간단하다.

GetModuleNameEx 이라는 함수를 통해 ProcessID로 실행파일 명을 얻어와서 체크한다.


GetProcessImageFileName 라는 함수도 있는데..

이 api는 \\device\\harddisk0\\ 이런식으로 실제 imagefilename을 찾아준다.


그럼..