2011-05-02 5 views
0

실행중인 컴퓨터에 따라 32 비트 또는 64 비트가 될 수있는 두 번째 응용 프로그램을 포탄하는 32 비트 응용 프로그램이 있습니다.32 비트 프로세스를 사용하여 64 비트 프로세스 정보를 찾는 방법

한 번에 두 번째 응용 프로그램 인스턴스 하나만 실행하면됩니다. 두 번째 응용 프로그램이 두 번 이상 실행되지 않도록 첫 번째 응용 프로그램이 필요합니다.

GetProcessesByName을 사용하여 실행중인 프로세스를 얻을 수 있기를 원합니다. 이것은 잘 작동하는 것 같습니다. 그것은 모듈 데이터를 얻으려고 시도 할 때 두 번째 애플리케이션이 실행되는 폴더를 찾아내는 것입니다.

32 비트 응용 프로그램에서 64 비트 프로세스와 원래 폴더를 식별 할 수있는 사람이 있습니까?

내가 두 번째 응용 프로그램을 시작할 때 당신이 뮤텍스를 설정하면 쉽게 할 수 있다고 생각 SH

답변

0

, 감사합니다. 주요 응용 프로그램에서
당신이 할 수 있습니다 : 그렇지 않으면 당신은 건너 뛰고, 뮤텍스가 존재하지 않는 경우 (실행할 때 뮤텍스를 생성하는와 닫을 때를 해제) 두 번째 응용 프로그램을 실행 ...

편집을 할

을 : 당신은 할 수 있습니다 뮤텍스 생성을 삽입하는 두 번째 앱을 수정하지 않습니다.
하지만 주요 애플 리케이션이 작업을 수행 할 수 있습니다

  • 만들기 true로 개인 부울을 설정 배경 노동자 BackgroudWorker wrk
  • : 새 응용 프로그램 실행을 할 때 bool running = false
  • 하는 WRK을 실행 if (running) return; running = true;
  • wrk가 프로세스를 생성하고 프로세스가 끝날 때까지 기다림
  • wrk가 끝나면 running = false
  • 그냥 생각

...

는 다시 편집 : 먼저 응용 프로그램을 닫고 다시 열 경우
, 사용자는 다시 두 번째 응용 프로그램을 실행 할 수 있습니다.
그래서 당신이 할 수 있습니다 :
경우 :

  • 이 (NTFS에 비어있을 수 있음) 새 응용 프로그램 실행을 할 때
  • 하는 WRK을 실행 배경 노동자 BackgroudWorker wrk
  • tmp를 파일을 쓰기 만들기 tmp 파일이 존재하고 나면 종료됩니다. WRK이 끝날 때
  • WRK는 사용자가 첫 번째 응용 프로그램을 종료하는 경우에도,이 방법으로 삭제 tmp 파일

을 끝

  • 을위한 프로세스 및 대기를 만들고, tmp 파일이 하드 디스크에 남아; 따라서 사용자가 첫 번째 앱을 다시 실행하면 두 번째 앱이 실행되지 않습니다.
    사용자가 스마트 인 경우이면이 파일을 완전히 삭제하고 트릭을 할 수 있습니다.
    마지막으로 사용자가 두 번째 앱을 직접 실행할 수 없습니까?

  • +0

    다른 응용 프로그램에서도이 작업을 수행했습니다. 두 번째 응용 프로그램을 편집 할 수있는 권한이 없습니다. 프로세스를 식별하고 특정 폴더에서 실행 된 프로세스 (있는 경우)를 식별하는 것은 모두 첫 번째 응용 프로그램까지입니다. – Superhuman

    +0

    죄송합니다. 두 번째 앱을 수정할 수 없다는 것을 깨닫지 못했습니다. – Marco

    +0

    내 솔루션은 프로세스를 검사하는 것이 더 안전하다고 생각합니다. 이렇게하려면 ** 관리자 여야하며 (일부 프로세스가 숨겨져 있어야합니다) – Marco

    0

    ManagementObjectSearcher과 같이 WMI API (System.Management 네임 스페이스)를 사용할 수 있습니다. 아래 예제는 실행중인 모든 메모장 인스턴스에서 프로세스 ID와 전체 명령 줄을 가져 오는 것을 보여줍니다.

    Imports System.Management 
    
    Module Module1 
    
        Sub Main() 
    
         Dim wmi = New ManagementObjectSearcher("SELECT ProcessId, CommandLine FROM Win32_Process WHERE CommandLine LIKE ""%notepad%""") 
         Dim result = wmi.Get().OfType(Of ManagementObject)() 
         For Each r In result 
          Console.WriteLine("Process ID: {0}, Command Line: {1}" r("ProcessId"), r("CommandLine")) 
         Next 
        End Sub 
    
    End Module 
    
    +0

    32 비트 프로세스의 일부로 실행될 때 위에 표시된 코드가 64 비트 프로세스에서 정보를 얻을 수 있습니까? 귀하의 코드를 입력하려했지만 구문 오류가 발생했습니다. WMI API에 익숙하지 않습니다. – Superhuman

    관련 문제