TB_GETBUTTON的结构是否合适? (WinXP)(也检测进程是64位还是32位)

问题描述 投票:0回答:1

我在这里使用js-ctypes在winxp上使用winapi在按钮索引1的任务栏上获得一个按钮。但是这一行在崩溃我的代码:var rez = SendMessage(hToolbar, 0x417 /** TB_GETBUTTON **/, 1, aButton.address());。我该如何修复以免崩溃?

我在这里遵循这个教程:http://w-shadow.com/blog/2006/10/01/manipulating-taskbar-buttons/

这是复制粘贴代码到暂存器:

Components.utils.import("resource://gre/modules/ctypes.jsm");

var user32 = ctypes.open('user32.dll');
var kernel = ctypes.open("kernel32.dll");
var HMODULE = ctypes.uint32_t;
var HWND = ctypes.uint32_t;
var LPCTSTR = ctypes.jschar.ptr;
var LPCSTR = ctypes.char.ptr;
var LoadLibrary = kernel.declare("LoadLibraryW", ctypes.winapi_abi, HMODULE, LPCTSTR);
var GetProcAddress = kernel.declare("GetProcAddress", ctypes.winapi_abi, ctypes.void_t.ptr, HMODULE, LPCSTR);

var hUser = LoadLibrary("user32");

/* http://msdn.microsoft.com/en-us/library/windows/desktop/ms633500%28v=vs.85%29.aspx
*/
var funcPtr0 = GetProcAddress(hUser, "FindWindowExW");
var FindWindowExType = ctypes.FunctionType(ctypes.winapi_abi, ctypes.int32_t, [HWND, HWND, LPCTSTR, LPCTSTR]);
funcPtr0 = ctypes.cast(funcPtr0, FindWindowExType.ptr);
//funcPtr0(0, "Test1", "Test2", 0);

var funcPtr1 = GetProcAddress(hUser, "GetTaskmanWindow");
var GetTaskmanWindowType = ctypes.FunctionType(ctypes.winapi_abi, ctypes.int32_t, []);
funcPtr1 = ctypes.cast(funcPtr1, GetTaskmanWindowType.ptr);

var hHwnd = funcPtr1();
var hToolbar = funcPtr0(hHwnd, 0, 'ToolbarWindow32', null);
Services.wm.getMostRecentWindow(null).alert(hToolbar)

var struct_TBButton = ctypes.StructType('TBButton', [
    {'iBitmap': ctypes.int},
    {'idCommand': ctypes.int},
    {'fbState': ctypes.unsigned_char},
    {'fsStyle': ctypes.unsigned_char},
    {'bReserved': ctypes.unsigned_char},
    {'dwData': ctypes.unsigned_long},
    {'iString': ctypes.int}
]);


var SendMessage = user32.declare('SendMessageW', ctypes.winapi_abi, ctypes.uintptr_t,
    ctypes.int32_t,
    ctypes.unsigned_int,
    ctypes.int32_t,
    ctypes.voidptr_t
);

var Count = SendMessage(hToolbar, 0x418 /** TB_BUTTONCOUNT **/, 0, ctypes.voidptr_t(0));
Services.wm.getMostRecentWindow(null).alert(Count);

var aButton = new struct_TBButton();
var rez = SendMessage(hToolbar, 0x417 /** TB_GETBUTTON **/, 1, aButton.address());
Services.wm.getMostRecentWindow(null).alert(rez);
javascript winapi firefox-addon windows-xp jsctypes
1个回答
1
投票

我没有时间/动力自己调试这个,但是有一个明显的错误可能导致崩溃:你的qazxsw poi定义是错误的。

struct_TBButton

{'bReserved': ctypes.unsigned_char},

#ifdef _WIN64 BYTE bReserved[6]; #else #if defined(_WIN32) BYTE bReserved[2]; #endif #endif 在32位进程中应为2字节(无符号字符),在64位进程中应为6字节。 (这些东西首先存在,以便数据成员正确地指针对齐)。

此外,您的指针类型是错误的,这将在64位进程中产生影响。

把它们放在一起(避免bReserved,因为我很懒):

ArrayType

PS:其他指针类型也是如此。 var struct_TBButton; if (ctypes.voidptr_t.size == 4 /* 32-bit */) { struct_TBButton = ctypes.StructType('TBButton', [ {'iBitmap': ctypes.int}, {'idCommand': ctypes.int}, {'fbState': ctypes.unsigned_char}, {'fsStyle': ctypes.unsigned_char}, {'bReserved': ctypes.unsigned_char}, {'bReserved2': ctypes.unsigned_char}, {'dwData': ctypes.uintptr_t}, {'iString': ctypes.intptr_t} ]); } else if (ctypes.voidptr_t.size == 8 /* 64-bit */) { struct_TBButton = ctypes.StructType('TBButton', [ {'iBitmap': ctypes.int}, {'idCommand': ctypes.int}, {'fbState': ctypes.unsigned_char}, {'fsStyle': ctypes.unsigned_char}, {'bReserved': ctypes.unsigned_char}, {'bReserved2': ctypes.unsigned_char}, {'bReserved3': ctypes.unsigned_char}, {'bReserved4': ctypes.unsigned_char}, {'bReserved5': ctypes.unsigned_char}, {'bReserved6': ctypes.unsigned_char}, {'dwData': ctypes.uintptr_t}, {'iString': ctypes.intptr_t} ]); } else { throw new Error("wut?!"); } console.log(struct_TBButton.size); // 20 on 32-bit, 32 on 64-bit if I'm not mistaken

例如。 https://stackoverflow.com/a/18040503/484441 == HWND WINAPI FindWindowEx()而不是void* WINAPI FindWindowEx(...)

© www.soinside.com 2019 - 2024. All rights reserved.