JNA Использование макросов - PullRequest
       10

JNA Использование макросов

0 голосов
/ 21 сентября 2011

Можно ли сопоставить следующую функцию макроса с JNA?

int ListView_FindItem(
 HWND hwnd,
int iStart,
const LPLVFINDINFO plvfi
);

Я пытался сопоставить эту функцию с StdCallLibraryb, но, похоже, это не работает (Функция не найдена, исключение выдается).

В основном я пытаюсь найти индекс определенного элемента в виде списка рабочего стола. У меня есть название предмета, который я собираюсь найти.

EDIT: я пытался использовать функцию отправки сообщения, я получаю следующее исключение

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function   
'GetMessage': The specified procedure could not be found.

at com.sun.jna.Function.<init>(Function.java:179)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:347)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:327)
at com.sun.jna.Library$Handler.invoke(Library.java:203)
at $Proxy0.GetMessage(Unknown Source)
at javaapplication4.Main.main(Main.java:43)
Java Result: 1

Это код, который я использовал

public class Main {


  public static class LVFINDINFO extends Structure {
     public int    flags =1002;
     public String psz = "new folder3";
     public LPARAM  lParam ;
     public POINT   pt;
     public int    vkDirection;
}
  public static class MSG extends Structure {
    public HWND hWnd;
    public int message;
    public int  wParam =-1;
    public LVFINDINFO lParam1;
    public int time;
    public POINT pt;

    public MSG(LVFINDINFO lParam) {
        lParam1 = lParam;
    }
}

public static void main(String[] args) {
    User32 user32 = (User32) Native.loadLibrary("User32", User32.class);

    LVFINDINFO i = new LVFINDINFO();
    MSG m = new MSG(i);
    user32.GetMessage(m, user32.GetDesktopWindow(), 0, 0);

    System.out.println(user32.GetMessage(m, user32.GetDesktopWindow(), 0, 0));
}

}

1 Ответ

3 голосов
/ 21 сентября 2011

Поскольку макрос существует только во время компиляции, его нельзя вызвать с помощью JNA.

Вам нужно посмотреть, что на самом деле делает макрос, и сделать это вместо этого. Согласно документации отправляет LVM_FINDITEM сообщение . Вам необходимо выяснить, как отправить это сообщение с помощью JNA.

...