Feeds:
文章
迴響

Archive for the ‘Node.js’ Category

曾經用 Python 寫過這個程式,這次用 node-ffi 重寫,基本邏輯都一樣

都是透過 win32 api 讀取剪貼簿內容並用正規表示法挖出超連結文字

完整程式如下:

201212091401

程式執行後,只要發現剪貼簿內容含有超連結就會印出來

可按下

‘c’ : 備份連結成檔案

‘d’: 清出目前偵測到的連結

‘q’: 結束程式

 

執行結果

201212091402

 

Read Full Post »

Windows 編譯 node-ffi

2012-12-9 更新

npm 上有同作者的另一個 ffi(v1.2.0)

經測試如果環境都正確,只要

npm install ffi

就可順利編譯成功~

——————————————

雖然在 linux 有編譯輸出 windows 版本的 ffi_bindings.node

可是執行時就是會錯,決定自己重編一個

開發環境

1) VC++ 2010  Express

2) Python 2.6.5

3) NodeJs 0.8.15 (內建 node-gyp)

4) Windows XP 32bits

5) node-ffi 0.5.5(libffi 3.0.11)

6) libffi-msvc

————————————-

我修改 node-ffi/src/ffi.cc, 因為直接編會發生無法連結 __imp_ffi_type_xxxx 的錯誤

可是 types.c 有定義且編譯成 libffi.lib 可是就是無法 link

所以我重新定義加上 my_ 前綴字,詳細自行參考原始碼

————————————-

我的專案檔可到這裡取得

依序編譯

  1. pthread => pthread.lib
  2. dlfcn => dlfcn.lib
  3. libffi => libffi.lib
  4. ffi_bindings => ffi_bindings.node

————————————

將 ffi_bindings.node 複製到 node-ffi/build/Release/ffi_bindings.node

————————————

測試

var ffi = require('node-ffi');
var user32 = ffi.Library('C:\\WINDOWS\\system32\\user32.dll', {
 'MessageBoxA': [ 'int', ['int32', 'string', 'string', 'uint'] ]
 });
user32.MessageBoxA(0, 'hello libffi for node', "win32api", 0);

201212061532

Read Full Post »

node-gyp 使用 proxy

node-gyp 編譯套件時,有時需要到網路上抓取相關檔案

如果對外連線需要透過 proxy

node-gyp 提供 4 種方式

1) 使用命令列參數 –proxy="http://myproxy"

2) 使用環境變數 http_proxy

3) 使用環境變數 HTTP_PROXY

4) 使用環境變數 npm_config_proxy

 

 

Read Full Post »

系統環境

  • Windows 7(64bits)
  • Python 2.7.2
  • Node 0.8.9
  • Visual Studio 2012

 

目錄結構

– binding.gyp
– hello.cc
– test.js
+ build
    + Release
        – hello.node

 

hello.cc

#include <node.h>
#include <v8.h>

using namespace v8;

Handle<Value> MethodArgs(const Arguments& args) {
HandleScope scope;

printf(“%d\n", args.Length());

if (args[0]->IsString() && args[1]->IsNumber() &&
args[2]->IsNumber() && args[3]->IsBoolean()) {

printf(“%s %d %f %d\n",
*String::AsciiValue(args[0]->ToString()),
args[1]->ToInteger()->Value(),
args[2]->NumberValue(),
args[3]->ToBoolean());

}

return scope.Close(Undefined());
}

Handle<Value> Add(const Arguments& args) {
HandleScope scope;

if (args.Length() < 2) {
ThrowException(Exception::TypeError(String::New(“Wrong number of arguments")));
return scope.Close(Undefined());
}

if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
ThrowException(Exception::TypeError(String::New(“Wrong arguments")));
return scope.Close(Undefined());
}

Local<Number> num = Number::New(args[0]->NumberValue() +
args[1]->NumberValue());
return scope.Close(num);
}

Handle<Value> Method(const Arguments& args) {
HandleScope scope;

printf(“%d\n", args.Length());

if (args[0]->IsString() && args[1]->IsNumber() &&
args[2]->IsNumber() && args[3]->IsBoolean()) {

printf(“%s %d %f %d\n",
*String::AsciiValue(args[0]->ToString()),
args[1]->ToInteger()->Value(),
args[2]->NumberValue(),
args[3]->ToBoolean());

}

return scope.Close(String::New(“world"));
}

void init(Handle<Object> target) {
NODE_SET_METHOD(target, “hello“, Method);
NODE_SET_METHOD(target, “add“, Add);
NODE_SET_METHOD(target, “testArgs“, MethodArgs);
}

NODE_MODULE(hello, init)

 

 

binding.gyp

{
“targets": [
{
“target_name": “hello",
“sources": [ “hello.cc" ]
}
]
}

test.js

var hello_module = require(‘./build/Release/hello.node’);
console.log(hello_module.hello());
console.log(hello_module.add(99, 1));
console.log(hello_module.testArgs(‘str’, 100, 300, true));

 

 

初始

node “C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" configure

編譯

node “C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" build

測試

node test.js

執行結果

參考資料

[1] http://snoopyxdy.blog.163.com/blog/static/601174402012102391344617/

Read Full Post »