2013-04-02 27 views
7

Tôi mới tại Node, tôi có máy chủ Node.js đơn giản này hoạt động trên cửa sổGọi Windows API từ Node.js msg

Máy chủ Mã

var ws = require("websocket-server"); 

var server = ws.createServer(); 

server.addListener("connection", function(client){ 
    console.log("new connection"); 
    client.send("aaaaaa"); 
    client.addListener("message", function(msg){ 
     console.log(msg); 
    }); 
}); 

server.listen(8080); 

Tôi chỉ muốn gọi cửa sổ API insted của dòng

console.log(msg); 

là có cách nào để làm điều này mà không sử dụng bên ngoài thư viện

bất kỳ ý tưởng?

Trả lời

10

Tôi nghĩ rằng node-ffi có thể giúp bạn thực hiện việc đó. node-ffi cung cấp chức năng tải và gọi các thư viện động. Với node-ffi bạn có thể truy cập vào user32 (ví dụ) lib và gọi các chức năng của chúng từ node.js.

var FFI = require('node-ffi'); 

function TEXT(text){ 
    return new Buffer(text, 'ucs2').toString('binary'); 
} 

var user32 = new FFI.Library('user32', { 
    'MessageBoxW': [ 
     'int32', [ 'int32', 'string', 'string', 'int32' ] 
    ] 
}); 

var OK_or_Cancel = user32.MessageBoxW(
    0, TEXT('I am Node.JS!'), TEXT('Hello, World!'), 1 
); 
+0

nhờ tôi đã thử nó, tiếc là không làm việc 'NPM cài đặt nút-ffi' không làm việc cho tôi, vì vậy tôi đã hỏi nếu có bất kỳ giải pháp mà không sử dụng thư viện bên ngoài –

+4

Theo như tôi biết node-ffi yêu cầu python được cài đặt trên hệ thống của bạn. Node.js không có các phương thức riêng để gọi các hàm winapi. –

+2

Tôi đã cài đặt nhưng có lỗi cấu hình: ERR gyp! định cấu hình lỗi ERR gyp! stack Lỗi: 'gyp' không thành công với mã thoát: 1 ERR gyp! ngăn xếp tại ChildProcess.onCpExit (C: \ ProgramFiles \ nodejs \ node_modules \ npm \ node_modules \ node-gyp \ lib \ configure.js: 415: 16) và do đó ... –

4

Tôi không muốn chỉnh sửa câu trả lời của @ Vadim vì nó được chấp nhận, nhưng tôi nghĩ gói đã được đổi tên thành 'ffi'. Điều này làm việc cho tôi:

npm install -s ffi 

Và sử dụng @ nguồn Vadim nhưng thay đổi tên gói để ffi:

var FFI = require('ffi'); 

function TEXT(text){ 
    return new Buffer(text, 'ucs2').toString('binary'); 
} 

var user32 = new FFI.Library('user32', { 
    'MessageBoxW': [ 
     'int32', [ 'int32', 'string', 'string', 'int32' ] 
    ] 
}); 

var OK_or_Cancel = user32.MessageBoxW(
    0, TEXT('I am Node.JS!'), TEXT('Hello, World!'), 1 
); 
Các vấn đề liên quan