node-ffi āđ€āļĢāļĩāļĒāļ functions āđƒāļ™ dll āļ”āđ‰āļ§āļĒ JavaScript āļāļąāļ™āļ•āļĢāļ‡āđ†

āļˆāļēāļāļ„āļ§āļēāļĄāđ€āļ”āļīāļĄāļ•āļ­āļ™āļ—āļĩāđˆāđāļĨāđ‰āļ§āļœāļĄāđ€āļ„āļĒāđ€āļ‚āļĩāļĒāļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Node.js Module āļ”āđ‰āļ§āļĒ C++ āļĄāļēāļ—āļĩāļ™āļķāļ‡āđāļĨāđ‰āļ§ āđāļ•āđˆāļ–āļķāļ‡āļ­āļĒāđˆāļēāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāđ€āļĢāļē
– āļĄāļĩ C++ Library āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļĨāđˆāļ°
– āļŦāļĢāļ·āļ­āļ­āļĒāļēāļāļ—āļģāđƒāļŦāđ‰ Node āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļžāļ§āļ System API āđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ­āļĒāļēāļāļĻāļķāļāļĐāļēāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ Node Module āđāļšāļš Native
āļœāļĄāļāđ‡āđ„āļ›āđ€āļˆāļ­āļ§āđˆāļēāļĄāļĩ Community āļ—āļĩāđˆāđ„āļ”āđ‰āļžāļąāļ’āļ™āļē Framework āļĄāļēāļ•āļąāļ§āļ™āļķāļ‡āļ‹āļķāđˆāļ‡āļ§āļąāļ™āļ™āļĩāđ‰āđ€āļĢāļēāļˆāļ°āļĄāļēāļžāļđāļ”āļ–āļķāļ‡āļāļąāļ™ āļ™āļąāđˆāļ™āļāđ‡āļ„āļ·āļ­ Node-ffi āļ‹āļķāđˆāļ‡āļĒāđˆāļ­āļĄāļēāļˆāļēāļ Foreign Function Interface

Node-ffi āļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™ Module āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļĨāļēāļ‡āđƒāļ™āļāļēāļĢāļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡ JavaScript Code āđ„āļ›āļ—āļĩāđˆ C++ Library āđ‚āļ”āļĒāļ—āļĩāđˆāđ€āļĢāļēāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™ Native Module āđ€āļ­āļ‡ āļ›āļĢāļ°āļĄāļēāļ“āļĢāļđāļ› Diagram āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļ„āļĢāļąāļš

ffi.png

āđ€āļĢāļēāļĄāļēāļĨāļ­āļ‡āļ”āļđāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļāļąāļ™āļ”āļĩāļāļ§āđˆāļēāļ„āļĢāļąāļš

āļāđˆāļ­āļ™āļ­āļ·āđˆāļ™āđ€āļĢāļēāļĄāļĩ C++ Library āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ DLL āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āđ€āļĢāļĩāļĒāļ āļ‹āļķāđˆāļ‡āļœāļĄāļĨāļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āļĄāļēāđāļšāļšāļ‡āđˆāļēāļĒāđ†āļ„āļ·āļ­ dll āļ—āļĩāđˆāļĄāļĩ function āđƒāļ™āļāļēāļĢ āļ”āļķāļ‡āļ„āđˆāļē Version āļ‚āļ­āļ‡ OS

extern "C" DLLIMPORT int getVersion()
{
 DWORD dwVer = ::GetVersion();
 DWORD majorVer = (DWORD)(LOBYTE(LOWORD(dwVer)));
 return majorVer;
};

āļ‹āļķāđˆāļ‡ API ::GetVersion āļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™āļ‚āļ­āļ‡ Windows SDK āļ„āļĢāļąāļš āļ‹āļķāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļąāđˆāļ‡ C++ āļœāļĄāđ„āļ”āđ‰āļ—āļģāļāļēāļĢ Â Compile āļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™ dll āļŠāļ·āđˆāļ­ dev.dll

āļ—āļĩāļ™āļĩāđ‰āļĄāļēāļĨāļ­āļ‡āļ”āļđāļŠāđˆāļ§āļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āđ€āļĢāļēāļāđ‡āļ„āļ·āļ­āļāļąāđˆāļ‡ JavaScript

var ffi = require('ffi');

var devModule = ffi.Library('dev', {
 'getVersion': [ 'int', [] ]
});
console.log('Windows version : ' + devModule.getVersion());

āļˆāļēāļ Code āļ™āļĩāđ‰āļāđ‡āļĄāļĩ 3 āļŠāđˆāļ§āļ™āļŦāļĨāļąāļāđ†āļ„āļĢāļąāļš

  1. require module ‘ffi’
  2. āļ›āļĢāļ°āļāļēāļĻāļāļēāļĢāļ—āļģ function binding
    ffi.Library('dev', {
      'getVersion': [ 'int', [] ]

    2.1 āļ—āļģāļāļēāļĢ binding āļāļąāļšāđ„āļŸāļĨāđŒ library āļŠāļ·āđˆāļ­Â dev.dll
    2.2 āļ—āļģāļāļēāļĢ binding āļāļąāļš function āļŠāļ·āđˆāļ­ getVersion āđ‚āļ”āļĒāļĄāļĩ ‘int’ āđ€āļ›āđ‡āļ™ Type āļ‚āļ­āļ‡ Return Value
    2.3 Function getVersion āļ™āļĩāđ‰āđ„āļĄāđˆāļĄāļĩ parameter āđ€āļĨāļĒāđƒāļŠāđˆāđ€āļ›āđ‡āļ™ []

  3. āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ ffi āļ”āđ‰āļ§āļĒ Â devModule.getVersion()

āļœāļĨāļ‚āļ­āļ‡āļāļēāļĢāļĢāļąāļ™āļāđ‡āđ€āļ›āđ‡āļ™āļ”āļąāļ‡āļ™āļĩāđ‰āļ„āļĢāļąāļšāļ„āļ·āļ­āđ„āļ”āđ‰āļ„āđˆāļē ’10’ āļĄāļēāļˆāļēāļ getVersion

ffi_run.png

āļ™āļ­āļāļˆāļēāļāļ™āļĩāđ‰āđ€āļĢāļēāļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļ°āļāļēāļĻāļāļēāļĢāļ—āļģ binding āļ—āļĩāļĨāļ°āļŦāļĨāļēāļĒāđ† function āļāđ‡āđ„āļ”āđ‰āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļ„āļĢāļąāļš(āļ‚āļ­āļ­āļ™āļļāļāļēāļ•āļīāđ„āļĄāđˆāđ‚āļŠāļ§āđŒ Code āļāļąāđˆāļ‡ C++ āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ€āļžāļīāđˆāļĄāđ€āļžāļ·āđˆāļ­āļ”āļķāļ‡āļ„āđˆāļē Minor,Build Version) āđ€āļŠāđˆāļ™

var devModule = ffi.Library('dev', {
 'getVersion': [ 'int', [] ] ,
 'getMinorVersion' : [ 'int', [] ],
 'getBuildVersion' : [ 'int', [] ]
});
console.log('Windows version : ' + devModule.getVersion());
console.log('Minor version : ' + devModule.getMinorVersion());
console.log('Build version : ' + devModule.getBuildVersion());

āļœāļĨāļāļēāļĢāļĢāļąāļ™āļāđ‡āļ”āļđāļ”āļĩāļ„āļĢāļąāļšāđāļĨāļ°āļ•āļĢāļ‡āļāļąāļš System Info āļˆāļĢāļīāļ‡āđ†āļ™āļ° ðŸ™‚

ffi_run2.png

āļŠāļĢāļļāļ› : node-ffi āļ™āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļĩāļāļŦāļ™āļķāđˆāļ‡āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļŠāļģāļŦāļĢāļąāļšāļ„āļ™āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™ Node.Js āļ”āđ‰āļ§āļĒ Context āļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš System āļŦāļĢāļ·āļ­ OS āļĢāļ°āļ”āļąāļš Low Level (āđ€āļŦāļĄāļ·āļ­āļ™āļœāļĄ..) āđ‚āļ”āļĒāļ—āļĩāđˆāđ€āļĢāļēāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļēāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ Node Module āđāļšāļš Native āļ—āļĩāđˆāļ­āļēāļˆāļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļāļ§āđˆāļēāļ—āļąāđ‰āļ‡āđƒāļ™āđāļ‡āđˆāļāļēāļĢāļ—āļģ Mapping āļžāļ§āļ Data Types āļĢāļ§āļĄāļ–āļķāļ‡āļāļēāļĢāļĄāļēāļ™āļąāđˆāļ‡āļĻāļķāļāļĐāļē V8 API  āļ‹āļķāđˆāļ‡āļœāļĄāļ„āļīāļ”āļ§āđˆāļē node-ffi āļ­āļēāļˆāļˆāļ°āļĄāļĩāļœāļĨāļāļĢāļ°āļ—āļšāļāļąāļš Performance āđƒāļ™āļāļēāļĢ call function āļšāđ‰āļēāļ‡ āđāļ•āđˆāļœāļĄāļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļĨāļ­āļ‡āļ§āļąāļ” āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āļ—āļąāđ‰āļ‡āļ™āļąāđ‰āļ™āđƒāļ„āļĢāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļžāļīāđˆāļĄāļāđ‡āđāļŠāļĢāđŒāļāļąāļ™āđ„āļ”āđ‰āļ„āļĢāļąāļš