Bonjour, je voudrais faire appelle a la fonction GlobalMemoryStatusEx de la librairie Kernel32.dll
https://docs.microsoft.com/en-us/win...memorystatusex

pour cela j'ai écrit le code suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package gestion;
import com.sun.jna.*;
import com.sun.jna.win32.StdCallLibrary;
 
public interface CHelloWorld extends StdCallLibrary {
    @Structure.FieldOrder({ "dwLength", "dwMemoryLoad","ullTotalPhys", "ullAvailPhys", "ullTotalPageFile", "ullAvailPageFile", "ullTotalVirtual", "ullAvailVirtual", "ullAvailExtendedVirtual" })
    public static class MEMORYSTATUSEX extends Structure {
        public static class ByReference extends MEMORYSTATUSEX implements Structure.ByReference {}
 
        public int dwLength;
 
        public int dwMemoryLoad;
        public int ullTotalPhys;
        public int ullAvailPhys;
        public int ullTotalPageFile;
 
        public int ullAvailPageFile;
        public int ullTotalVirtual;
        public int ullAvailVirtual;
        public int ullAvailExtendedVirtual;
 
        }
    @Structure.FieldOrder({ "wYear", "wMonth", "wDayOfWeek", "wDay", "wHour", "wMinute", "wSecond", "wMilliseconds" })
    public static class SYSTEMTIME extends Structure {
        public short wYear;
        public short wMonth;
        public short wDayOfWeek;
        public short wDay;
        public short wHour;
        public short wMinute;
        public short wSecond;
        public short wMilliseconds;
 
    }
 
    public void GetSystemTime(SYSTEMTIME result);
    public boolean GlobalMemoryStatusEx(MEMORYSTATUSEX.ByReference lpBuffer);
    public CHelloWorld INSTANCE = (CHelloWorld)
            Native.load("kernel32",
                    CHelloWorld.class);
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
public class main {
    public static void main(String[] args) throws IOException, InterruptedException {
        CHelloWorld.SYSTEMTIME time = new CHelloWorld.SYSTEMTIME();
        CHelloWorld.INSTANCE.GetSystemTime(time);
        System.out.println("GetSystemTime" + time.wDay);
 
        CHelloWorld.MEMORYSTATUSEX.ByReference e3ref = new CHelloWorld.MEMORYSTATUSEX.ByReference();
        e3ref.dwLength=36;
        System.out.println("GlobalMemoryStatusEx");
        System.out.println(CHelloWorld.INSTANCE.GlobalMemoryStatusEx(e3ref));
    }
}
J'appelle la fonction GetSystemTime cela me renvoie quelque chose

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
CHelloWorld.INSTANCE.GetSystemTime(time);
System.out.println("GetSystemTime" + time.wDay);
quand c'est GlobalMemoryStatusEx cela renvoie false
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
System.out.println("GlobalMemoryStatusEx");
System.out.println(CHelloWorld.INSTANCE.GlobalMemoryStatusEx(e3ref));
J ai plusieurs questions:

Pour recupere la taille de ma structure e3ref.dwLength est-ce qui n'a pas un équivalent en java de sizeof() en c je dois le pâsser en parametre pour la fonction GlobalMemoryStatusEx
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
       CHelloWorld.MEMORYSTATUSEX.ByReference e3ref = new   CHelloWorld.MEMORYSTATUSEX.ByReference();
        e3ref.dwLength=36;
        System.out.println("GlobalMemoryStatusEx");
        System.out.println(CHelloWorld.INSTANCE.GlobalMemoryStatusEx(e3ref));
Sinon pour la conversion de type natif/java, est ce que dwordLong devient int car j'ai plusieurs champs de ce type dans ma structure

documentation pour la conversion https://github.com/java-native-acces...ww/Mappings.md