2013-05-04 1 views
0

JNA를 사용하여 현재 실행중인 모든 Windows 프로그램과 해당 명령 줄의 목록을 가져 오는 방법을 찾고 있습니다. 이 사이트 (Get list of processes on Windows in a charset-safe way)에는 실행중인 프로그램 이름 목록을 얻는 방법을 보여주는 몇 가지 자습서가 있지만 전체 명령 줄을 찾고 있습니다. 게시물에 Module32First 함수를 사용하는 것에 대한 언급이 있지만 JNA를 통해이를 사용하는 방법에 대한 문서를 찾지 못하는 것 같습니다. 어떤 아이디어?JNA : 모든 Windows 프로세스 명령 줄 가져 오기

편집 :

나는 현재 위에서 언급 한 게시물에서 아래를 시도했다. 아이디어는 현재 실행중인 모든 프로세스를 윈도우에서 반복 실행하고 명령 행을 얻는 프로세스 방식을 원한다는 것입니다. 우리는 wmic를 사용하고 싶지 않습니다.

Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS); 
    Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();   

    WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0)); 
    try { 
     while (kernel32.Process32Next(snapshot, processEntry)) {    
      System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile)); 
     } 
    } 
    finally { 
     kernel32.CloseHandle(snapshot); 
    } 

EDIT2 : 윈도우 API (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx)보고

는 아래를 말한다. JNA를 통해 실행 파일에 대한 전체 경로를 얻으려고합니다. JNA가 MODULE32ENTRY 구조체를 지원하지 않는 Module32First 함수라고 생각합니다.

szExeFile 프로세스의 실행 파일 이름입니다. 실행 파일의 전체 경로를 검색하려면 Module32First 함수를 호출하고 반환되는 MODULEENTRY32 구조체의 szExePath 멤버를 확인합니다. 그러나 호출 프로세스가 32 비트 프로세스 인 경우, QueryFullProcessImageName 함수를 호출하여 64 비트 프로세스의 실행 파일의 전체 경로를 검색해야합니다.

답변

0

지금까지 해보신 것은 무엇입니까? 타입 매핑은 간단하며, JNA는 기존 정의를 쉽게 확장하여 확장 할 수 있도록 설계되었습니다.

// Original C 
typedef struct tagMODULEENTRY32 { 
    DWORD dwSize; 
    DWORD th32ModuleID; 
    DWORD th32ProcessID; 
    DWORD GlblcntUsage; 
    DWORD ProccntUsage; 
    BYTE *modBaseAddr; 
    DWORD modBaseSize; 
    HMODULE hModule; 
    TCHAR szModule[MAX_MODULE_NAME32 + 1]; 
    TCHAR szExePath[MAX_PATH]; 
} MODULEENTRY32, *PMODULEENTRY32; 

// JNA equivalent (unicode version) 
public interface MyKernel32 extends Kernel32 { 
    class MODULEENTRY32 extends Structure { 
     DWORD dwSize; 
     DWORD th32ModuleID; 
     DWORD th32ProcessID; 
     DWORD GlblcntUsage; 
     DWORD ProccntUsage; 
     Pointer modBaseAddr; 
     DWORD modBaseSize; 
     HMODULE hModule; 
     char[] szModule = new char[MAX_MODUE_NAME32+1]; 
     char[] szExePath = new char[MAX_PATH]; 
     public String szModule() { return Native.toString(this.szModule); } 
     public String szExePath() { return Native.toString(this.szExePath); } 
     protected List getFieldOrder() { 
      return Arrays.asList(new String[] { 
       "dwSize", "th32ModuleID", "th32ProcessID", "GlblcntUsage", "ProccntUsage", "modBaseAddr", "modBaseSize", "hModule", "szModule", "szExePath", 
      }); 
     } 
    } 

    MyKernel32 INSTANCE = (MyKernel32)Native.loadLibrary("kernel32", W32DEFAULT_OPTIONS); 
    boolean Module32First(HANDLE hSnapshot, MODULEENTRY32 lpme); 
} 
+0

내가 뭘 시도했는지, 시도하려는 것을 더 명확하게 설명하기 위해 위 게시물에서 편집했습니다. –