рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 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 рдХреЗрд╡рд▓ рдмреАрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ)ред



All Articles