рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 4 рдореЗрдВ js-ctypes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡

рдЬрд┐рд╕ рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдЗрдВрдЯрд░рдиреЗрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реА рд╣реИред рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рд╕реЗ рдЗрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд╡рд┐рдВрдбреЛ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ рдФрд░ WM_COPYDATA рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬ-рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╕реА рдореЗрдВ рдПрдХ XPCOM рдШрдЯрдХ рд▓рд┐рдЦрдирд╛ рдерд╛ред рдЪреМрдереЗ рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдореЗрдВ, рдкреБрд░рд╛рдиреЗ рдмрд╛рдЗрдирд░реА рдШрдЯрдХреЛрдВ рдиреЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЙрд╕реА рд╕рдордп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ- js-ctypes рд╕реЗ рдЬреАрдд-рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЬрдм рдореИрдВ C рд╕реЗ JS рддрдХ рдХреЛрдб рдХреЙрдкреА рдХрд░ рд░рд╣рд╛ рдерд╛, рдореИрдВ рдЙрди рд╕рднреА рдиреБрдХрд╕рд╛рдиреЛрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдм рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдХреЛрдб рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

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

// - 64 32 . Firefox-64 default_abi, 32 default_abi winapi_abi. default_abi, - .

var CallBackType;
var WinABI;

// FF64 FF32, - size_t, 8 4
if (ctypes.size_t.size == 8) {
CallBackABI = ctypes.default_abi;
WinABI = ctypes.default_abi;
} else {
CallBackABI = ctypes.stdcall_abi;
WinABI = ctypes.winapi_abi;
}

// dll
var user32dll = ctypes.open( 'user32.dll' );
var kernel32dll = ctypes.open( 'kernel32.dll' );

//
const EnumWindowsProc = ctypes.FunctionType(CallBackABI, ctypes. bool , [ctypes.size_t, ctypes.size_t]);

var EnumWindows = user32dll.declare( 'EnumWindows' , WinABI, ctypes. bool , EnumWindowsProc.ptr, ctypes.size_t);

var SendMessage = user32dll.declare( 'SendMessageW' , WinABI, ctypes.size_t, ctypes.size_t, ctypes.unsigned_int, ctypes.size_t, ctypes.size_t);
// , :
//const HWND = ctypes.size_t;
//const WPARAM = ctypes.size_t;
//const LPARAM = ctypes.size_t;
//const LRESULT = ctypes.size_t;
//const UINT = ctypes.unsigned_int;
//SendMessage = user32dll.declare('SendMessageW', WinABI, LRESULT, HWND, UINT, WPARAM, LPARAM);

var GetClassName = user32dll.declare( 'GetClassNameW' , WinABI, ctypes. int , ctypes.size_t, ctypes.jschar.ptr, ctypes. int );

var WideCharToMultiByte = kernel32dll.declare( 'WideCharToMultiByte' , WinABI, ctypes. int , ctypes.unsigned_int, ctypes.uint32_t, ctypes.jschar.ptr, ctypes. int , ctypes. char .ptr, ctypes. int , ctypes. char .ptr, ctypes. bool .ptr);

const WM_COPYDATA = 74;

// COPYDATA
const COPYDATASTRUCT = new ctypes.StructType( 'COPYDATASTRUCT' ,
[ { 'dwData' : ctypes.uintptr_t},
{ 'cbData' : ctypes.uint32_t},
{ 'lpData' : ctypes.voidptr_t}
]);

// XPCOM UTF-16, UTF-8. - , UTF-16 ,
function Wide2Ansi(str) {
if (str) {
var i = WideCharToMultiByte(CP_ACP, 0, str, -1, null , 0, null , null );
// . new - , -
var buf = new new ctypes.ArrayType(ctypes. char , i);
i = WideCharToMultiByte(CP_ACP, 0, str, -1, buf, i, null , null );
//- , , buf.readString(),
if (i)
return buf;
}
return null ;
}

// , Windows
function SearchPD(hwnd, lParam) {
var result = true ;

var buf = new new ctypes.ArrayType(ctypes.jschar, 255);
GetClassName(hwnd, buf, 255);
if (buf.readString() == 'TMainForm' ) {
//
ctypes.size_t.ptr(lParam).contents = hwnd;
result = false ;
}
return result;
}

function GetHwnd() {
// -
var SearchPD_ptr = EnumWindowsProc.ptr(SearchPD);
// , -
var wnd = ctypes.size_t(0);

// , ctypes.cast
EnumWindows(SearchPD_ptr, ctypes.cast(wnd.address(), ctypes.size_t));
// ,
return wnd.address().contents;
}

var hWnd = GetHwnd();
//- , ctypes.size_t 64 , , , if (hWnd) , hWnd.
if (hWnd != 0) {
var command = 'hWnd=' + hWnd;

var CD = new COPYDATASTRUCT();

// Ansi UTF-8 UTF-16 ctypes.jschar.array()
var cmd = Wide2Ansi(ctypes.jschar.array()(command))
if (cmd) {
CD.lpData = cmd.address();
CD.cbData = cmd.length - 1;
CD.dwData = 0;
SendMessage(hWnd, WM_COPYDATA, 0, ctypes.cast(CD.address(), ctypes.size_t));
}
}


* This source code was highlighted with Source Code Highlighter .

рдЙрджрд╛рд╣рд░рдг рдХреА рдЕрдзрд┐рдХ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдмрд╣реБрдд рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рдерд╛ред рдЖрдк рдореЛрдЬрд╝рд┐рд▓рд╛ рд╕рд╛рдЗрдЯ рд╕реЗ рдРрдб-рдСрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрдмрдХрд┐ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг 1.5 рдХреЗрд╡рд▓ рдмреАрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ)ред


Source: https://habr.com/ru/post/In111044/


All Articles