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