Извличане на текст на елемент с JNA и SendMessage()

Опитвам се да извлека текста на елемента от контрола, подобна на Win32 ListView. Използвам JNA и SendMessageW(), за да изпратя LVM_GETITEMTEXTW към контролата. Успях да извлека броя на артикулите (чрез LVM_GETITEMCOUNT), но в този момент съм объркан. Моят клас User32 е настроен така:

public interface MyUser32 extends User32 {

    MyUser32 INSTANCE = (MyUser32)Native.loadLibrary("user32", MyUser32.class);
    LRESULT SendMessageW(HWND hWnd, int msg, WPARAM wParam, LVITEM lParam); 

}

Моят клас LVITEM е настроен така:

public class LVITEM extends Structure{


    public LVITEM() {
        pszText = new Memory(MEMSIZE);
        cchTextMax = MEMSIZE;
    }

    private static final int MEMSIZE = 256;

    public UINT mask;
    public int iItem;
    public int iSubItem;
    public UINT state;
    public UINT stateMask;
    public Pointer pszText;
    public int cchTextMax;
    public int iImage;
    public LPARAM lParam;
    public int iIndent;

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

И кодът, който извиква всичко, е така:

MyUser32 u32 = MyUser32.INSTANCE;   
LVITEM lvItem = new LVITEM();
WPARAM wPar = new WPARAM(1);

...

lvItem.iSubItem = 0;
res = u32.SendMessageW(handle, LVM_GETITEMTEXTW, wPar, lvItem);

System.out.println(res.intValue());
s = lvItem.pszText.getString(0);        
System.out.println(s);

Пропуснах част от кода, но вярвам, че това са важните части. Проблемът ми е, че когато отпечатам res.intValue(), той винаги е 0 (което означава, че не е върнат текст) и когато отпечатам стойността на низа на pszText, това винаги е някакъв боклук. В този момент съм напълно объркан, така че всички предложения са високо оценени. Благодаря.


person Bren    schedule 23.05.2013    source източник
comment
Предполагам, че LVM_GETITEMTEXTW означава уникод (срещу ascii), така че поне трябва да поискате широк низ от вашата lvItem.psxText памет.   -  person technomage    schedule 24.05.2013
comment
Благодаря за предложението, това вероятно решава друг проблем, с който щях да се сблъскам надолу по линията. Всъщност реших да публикувам тук въз основа на вашите коментари по друг въпрос от февруари: stackoverflow.com/questions/14975347/ Следих някои от предложенията от тази връзка, но нищо, което правя, изглежда не променя нещата. Ако помага, използвам и този сайт на MSDN като справка: msdn.microsoft.com/en-us/library/windows/desktop/   -  person Bren    schedule 24.05.2013
comment
Вероятно трябва да зададете маската на различна от нула, за да посочите кои структурни полета искате/са валидни.   -  person technomage    schedule 24.05.2013
comment
Сега използвах Spy++, за да видя какво всъщност се изпраща на контролата и това е боклук, така че изглежда, че проблемът е в структурата LVITEM или как се изпраща до SendMessageW. Четвъртият аргумент на SendMessageW е LPARAM, за който се предполага, че е указател към структура LVITEM. Правилно ли го предавам?   -  person Bren    schedule 24.05.2013
comment
Показателят от страната на Java съвпада ли с това, което се вижда от Spy++? Ако е така, дъмп на паметта на структурата на Java (jna.dump_memory=true и извикване Structure.toString()) съответства ли на някоя част от това, което се вижда от Spy++?   -  person technomage    schedule 26.05.2013
comment
Когато извикам lvItem.toString(), той показва същия адрес на паметта като в Spy++. Всички настройки се показват правилно в конзолата на Eclipse, но стойностите са напълно различни в Spy++.   -  person Bren    schedule 28.05.2013