NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 외부 프로그램의 실행 파일 경로 알아내기. (Finding the path of the external program's ex…

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 일반적으로 외부 프로그램의 실행 파일 경로를 알아낼 일이 있을까 싶지만... 매크로 프로그램이 아니라면요^^; 혹시나 매크로 프로그램을 개발하시거나 특수한 상황에서 다른 프로그램의 실행 파일 경로가 필요한 경우 아래 코드를 유용하게 사용할 수 있을겁니다.

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static string GetPathByProcessID(int pid)
    {
        var processHandle = OpenProcess(
            (int)Options.SetWindowPosFlags.SWP_NOSENDCHANGING | 
            (int)Options.SetWindowPosFlags.SWP_NOACTIVATE, 
            false, 
            pid);
    
        if (processHandle == IntPtr.Zero)
            return null;
    
        const int lengthSb = 4000;
    
        var sb = new StringBuilder(lengthSb);
    
        string result = null;
    
        if (GetModuleFileNameEx(processHandle, IntPtr.Zero, sb, lengthSb) > 0)
            result = sb.ToString();
    
        CloseHandle(processHandle);
    
        return result;
    }

     

    핵심 함수는 GetModuleFileNameEx입니다.

    [DllImport("psapi.dll")]
    internal static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, [Out] StringBuilder lpBaseName, [In] [MarshalAs(UnmanagedType.U4)] int nSize);

     

    이외에 프로세스의 핸들을 가져오는 함수예요.

    [DllImport("kernel32.dll")]
    internal static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

     

    아래는 함수 이름 때문에 오해가 생길수도 있는데요. 핸들의 프로세스를 종료시키는게 아닌 참조를 해제하겠다는 의미입니다. 이 함수를 호출하면 핸들의 프로세서가 커널 오브젝트의 Usage Count에서 갯수가 줄어듭니다.

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool CloseHandle(IntPtr hObject);

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.