java - JNA - Query Windows Processes

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bruge JNA til at returnere detaljer om en bestemt Windows-proces. Ikke helt sikker på hvordan man gør det. Kunne ikke finde meget på interwebs for hjælp. Nogle oplysninger, jeg gerne vil returnere, omfatter CPU og hukommelsesbrug. Nedenfor er blot et eksempel jeg fandt.


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

import com.sun.jna.*;
import com.sun.jna.Library.Handler;
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.Advapi32Util.*;
import com.sun.jna.platform.win32.WinNT.*;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.*;

import com.sun.jna.Native; 
import com.sun.jna.platform.win32.*; 
import com.sun.jna.win32.W32APIOptions;


public class WindowsProcess {

    public static void main(String[] args) {

        WinNT winNT = (WinNT) Native.loadLibrary(WinNT.class, W32APIOptions.UNICODE\_OPTIONS);          
        WinNT.HANDLE snapshot = winNT.CreateToolhelp32Snapshot(Tlhelp32.TH32CS\_SNAPPROCESS, new WinDef.DWORD(0));  
        Thelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();          

        while (winNT.Process32Next(snapshot, processEntry)) {             
        System.out.println(processEntry.th32ProcessID + "	" + Native.toString(processEntry.szExeFile));         

        }          
        winNT.CloseHandle(snapshot);     
        } 

    }

Bedste reference


Dette virker med JNA 3.5.0. Eksemplet du har er ikke kompatibelt med nyere versioner af biblioteket, tror jeg. [3]


import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.Tlhelp32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.win32.W32APIOptions;
import com.sun.jna.Native; 

public class ListProcesses {
    public static void main(String[] args) {
        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 + "	" + Native.toString(processEntry.szExeFile));
            }
        }
        finally {
            kernel32.CloseHandle(snapshot);
        }
    } 
}


Se også mit svar andetsteds.