JNA: Przekaż wskaźnik do struktury do funkcji SendMessage User32.dll jako LPARAM

Muszę wykonać proste zadanie: wydrukować nazwy elementów widoku listy w oknie eksploratora. Załóżmy, że otwieram „C: Documents and Settings” na moim pulpicie, a następnie chcę napisać program Java za pomocą JNA, aby wydrukować wszystkie nazwy folderów / plików w otwartym oknie eksploratora.

Co mogłem zrobić: Pobierz uchwyt otwartego okna eksploratora i uchwyt do widoku listy wewnątrz.

Czego się dowiedziałem: muszę wywołać funkcję SendMessage w User32.dll i przekazać jej uchwyt do powyższego listview wraz z kodem wiadomości (który jest (0x1000 + 45) dla LVM_GETITEMTEXTA), wraz z 0 numer indeksu elementu widoku listy, którego nazwę muszę uzyskać, i LPARAM (która ma długą wartość). Ten LPARAM zaakceptuje wskaźnik do struktury typu LVITEM. Dokumentację wiadomości możesz odesłać tutaj:http://msdn.microsoft.com/en-us/library/windows/desktop/bb761055(v=vs.85).aspx

Stworzyłem strukturę LVITEM w moim interfejsie dla użytkownika 32 w następujący sposób:

public static class LVITEM extends Structure
    {
        public short mask;
        public int iItem;
        public int iSubItem;
        public short state;
        public short stateMask;
        public char[] pszText;
        public int cchTextMax;
        public int iImage;
        public LPARAM lParam;
        public int iIndent;

        protected List getFieldOrder()
        {
            return Arrays.asList(new String[] { "mask", "iItem", "iSubItem", "state", "stateMask", "pszText", "cchTextMax", "iImage", "lParam", "iIndent" });
        }

    }

Moja inicjalizacja struktury wygląda następująco:

User32.LVITEM lvItem = new User32.LVITEM(); //User32 is the name of the interface containing the LVITEM structure
lvItem.mask = 0x00000001; //code for LVIF_TEXT
lvItem.pszText= new char[260];
lvItem.iSubItem = 0;
lvItem.cchTextMax = 260;

Wywołuję funkcję SendMessage w pętli for, aby wydrukować nazwy wszystkich elementów widoku listy w następujący sposób:

for(int j=0;j<nItems;j++)
{
lvItem.iItem= j;
LRESULT lrs = User32.INSTANCE.SendMessageA(handleToListView, (0x1000 + 45) , new WPARAM(j), new LPARAM(lvItem.getPointer().getLong(0)));
}

Jeśli wypisz lvItem.getPointer (). GetLong (0) - otrzymuję 0, zamiast długiej wartości, która reprezentuje wskaźnik.

Jeśli wydrukuję lrs lub lvItem.pszText - nie otrzymam nazwy folderu. Otrzymuję pustą wartość / 0.

Wiem, że dokumentacja JNA mówi, że wskaźnik do struktury jest traktowany jako struktura w JNA. Ale jeśli nie wykonam lvItem.getPointer, to w jaki sposób będę mógł przekonwertować strukturę na długą wartość, która jest wymagana jako argument konstruktora LPARAM?

Co ja robię źle? Proszę pomóż. Spędziłem już sporo czasu na badaniach, a ponieważ jestem nowy w JNA, nie byłem w stanie zrozumieć, co się dzieje.

Środowisko: Win XP Pro, wersja JNA: 3.4

questionAnswers(1)

yourAnswerToTheQuestion