node-ffi - callback extraction of EnumWindows

Requirement is to get all windows open in current desktop. I am trying to invoke EnumWindows from node-ffi which gives handler length as 0.

node reference link : node-ffi module

My Code Snippet: /**

@Name :Parthasarathy Balakrishnan
@Version : V0.1
@Date : 18/03/2013 */

    var ffi = require('ffi'),
    ref = require('ref'),
    int = ref.types.int,
    assert = require('assert'),
    bindings = require('bindings'),
    buffer = require('buffer')

    var user32,Kernel32;
    var lpEnumFunc;
    var invokeCount=0;

    /**EnumWindows API CALL
    BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc,_In_ LPARAM lParam);
    Parameters
    lpEnumFunc [in]
    Type: WNDENUMPROC
    A pointer to an application-defined callback function. For more information, see EnumWindowsProc.
    lParam [in]
    Type: LPARAM
    An application-defined value to be passed to the callback function.
    **/
    user32 = new ffi.Library('user32', {'EnumWindows':[ 'bool', ['pointer','int32'] ], // BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc,_In_ LPARAM lParam);
    'GetWindowTextW':[ 'int32', ['pointer','pointer','int32']]});

    Kernel32 = new ffi.Library('kernel32', {'GetLastError':['bool', ['pointer','int32'] ]}); // Not required for this demo

    lpEnumFunc = ffi.Callback('bool',['pointer','int32'],function (hwnd,lParam){ 
    console.log("------------------START---------------------") 
    console.log(hwnd);
    console.log(ref.getType(hwnd));
    console.log("Is Buffer/Pointer NULL :\t"+ref.isNull(hwnd));
    console.log("lParam :\t"+lParam)
    console.log("EnumWindows Callback handler : \t "+hwnd.length);
    //Pointer implementations-start
    var buf = new Buffer(ref.sizeof.pointer);
    ref.writePointer(buf, 0, hwnd);
    var out = ref.readPointer(buf, 0, hwnd.length)
    for (var i = 0, l = out.length; i < l; i++) {
    console.log(out[i])
    }
    //Pointer implementations-end
    console.log("ref address :\t"+ref.address(hwnd));
    console.log("------------------END---------------------")

    return true;
    });

    console.log("Calling EnumWindows init");
    var bool = user32.EnumWindows(lpEnumFunc,0);
    console.log("EnumWindows return value :\t"+bool);
    // register the callback function

    process.on('uncaughtException', function () {
    console.error('uncaught:', arguments);
    });

Output: Calling EnumWindows init

    ------------------START---------------------
         { size: 0,
            indirection: 1,
            get: [Function: get],
            set: [Function: set],
            name: 'void',
            ffi_type: }

            Is Buffer/Pointer NULL : false
            lParam : 0
            EnumWindows Callback handler : 0
            ref address : 197424

    ------------------END---------------------

From the output I am getting Handler size as 0. Please let me know what I am doing wrong.

Many Thanks, Partha

You seem to be treating 'hwnd' as a pointer, think you can simply use a int or long. This worked for me (coffeescript) :

ref = require 'ref'
ffi = require 'ffi

voidPtr = ref.refType(ref.types.void)
stringPtr = ref.refType(ref.types.CString)

bindings =
    EnumWindows: ['bool', [voidPtr, 'int32']]
    GetWindowTextA : ['long', ['long', stringPtr, 'long']]

user32 = ffi.Library('user32.dll', bindings)

windowProc = ffi.Callback 'bool', ['long', 'int32'], (hwnd, lParam) ->
    buf = new Buffer 255
    ret = libm.GetWindowTextA hwnd, buf, 255
    name = ref.readCString(buf, 0)
    console.log name
    true

user32.EnumWindows windowProc, 0