js-ctypes: Указател към intptr_t

В ctypes имам

TBButton.ptr(ctypes.UInt64("0x1e677e60")

Това е еквивалентно на aButton.address() в този ред от код тук:

var rez = SendMessage(hToolbar, 0x417 /** TB_GETBUTTON **/, 1, aButton.address());

Когато стартирам този код, получавам грешка:

Изключение: очакван тип intptr_t, получен TBButton.ptr(ctypes.UInt64("0xaa4eb20"))

Това е така, защото в моята SendMessage дефиниция имам това:

var SendMessage = user32.declare('SendMessageW', ctypes.winapi_abi, ctypes.intptr_t,
    ctypes.voidptr_t, // HWND
    ctypes.uint32_t, // MSG
    ctypes.uintptr_t, // WPARAM
    ctypes.intptr_t // LPARAM
);

Въпросът ми е: какъв е типът TBButton.ptr(ctypes.UInt64("0x1e677e60"), за да мога да променя LPARAM в дефиницията SendMessage на този тип.

Или алтернативно: Възможно ли е това да бъде intptr_t? Нещо като ctypes.intptr_t(aButton.address()), което пробвах това не работи.


person Noitidart    schedule 18.06.2014    source източник


Отговори (1)


Това е указател към TBButton, каквото и да е TBButton, докато intptr_t всъщност е достатъчно голямо цяло число, за да съдържа адрес на указател.

Трябва да прехвърлите показалеца към intptr_t.

var lparam = ctypes.cast(tbbuttonptr, ctypes.intptr_t);
person nmaier    schedule 18.06.2014
comment
Опитах това, но получавам грешка: var aButton = ctypes.cast(new struct_TBButton(), ctypes.intptr_t); var rez = SendMessage(hToolbar, 0x417 /** TB_GETBUTTON **/, 1, aButton.address()); върнатата грешка е = Exception: expected type intptr_t, got ctypes.intptr_t.ptr(ctypes.UInt64("0x11d87c00")) - person Noitidart; 18.06.2014
comment
ако след това направя aButton.address(), той затваря на drwatsn32.exe: var aButton = ctypes.cast(new struct_TBButton(), ctypes.intptr_t); var rez = SendMessage(hToolbar, 0x417 /** TB_GETBUTTON **/, 1, aButton); - person Noitidart; 18.06.2014
comment
Моят код е тук: gist.github.com/Noitidart/f691ab9a750f24be346f (на winxp), моля помогнете, боря се с това от дълго време :( - person Noitidart; 18.06.2014
comment
Опитах го и направи срив/увисване на drwatsn32.exe :( var aButton = new struct_TBButton(); var rez = SendMessage(hToolbar, 0x417 /** TB_GETBUTTON **/, 1, ctypes.cast(aButton.address(), ctypes.intptr_t)); стойността на rez след като убия процеса drwatsn32.exe е 0 - person Noitidart; 18.06.2014
comment
Това не е свързано с въпроса, който беше за това как да хвърляме нещо. Зададохте въпроса си за срив няколко пъти вече в друг контекст... Вероятно трябва да изчакате някой да отговори, вместо да спамите едно и също нещо в различни секции за коментари... - person nmaier; 18.06.2014
comment
О, добре, извинете ме, моля, работих върху него и реших, че виси, защото правя грешен тип. На другите места просто си мислех, че целият този контекст е проблемът за увисването. Ще спра. - person Noitidart; 18.06.2014
comment
Получихте отговора си сега на ask.moz - person nmaier; 19.06.2014
comment
Няма начин, благодаря, човече, ще отида да го проверя! Редактиране: О, боже, това беше ти, благодаря ти, човече. :'( - person Noitidart; 19.06.2014