我正在使用v8为node.js编写C ++库。我在Windows上,我想从我的C ++代码中调用Win32 API函数EnumWindows
。 EnumWindows
将回调函数和可选的回调函数参数作为参数。我对这个C ++库的唯一目标是将EnumWindows
公开给javascript-land,并按如下方式使用...
mymodule.EnumWindows(function (id) { ... });
所以,我的C ++代码看起来像这样......
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
// re-cast the Local<Function> and call it with hWnd
return true;
}
Handle<Value> EnumWindows(const Arguments& args)
{
HandleScope scope;
// store callback function
auto callback = Local<Function>::Cast(args[0]);
// enum windows
auto result = EnumWindows(EnumWindowsProc, callback);
return scope.Close(Boolean::New(result == 1));
}
我的问题是如何将Local<Function
封装器中的EnumWindows
传递给EnumWindowsProc
回调函数? EnumWindowsProc
在同一个线程中执行。
答案 0 :(得分:1)
您可以传递callback
的地址:
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
Local<Function>& f = *reinterpret_cast<Local<Function>*>(lParam);
// use f
return true;
}
Handle<Value> EnumWindows(const Arguments& args)
{
HandleScope scope;
// store callback function
auto callback = Local<Function>::Cast(args[0]);
// enum windows
auto result = EnumWindows(EnumWindowsProc,
reinterpret_cast<LPARAM>(&callback));
return scope.Close(Boolean::New(result == 1));
}
另一种选择是收集句柄以便以后处理它们:
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
std::vector<HWND>* p = reinterpret_cast<std::vector<HWND>*>(lParam);
p->push_back(hWnd);
return true;
}
Handle<Value> EnumWindows(const Arguments& args)
{
HandleScope scope;
// store callback function
auto callback = Local<Function>::Cast(args[0]);
// enum windows
std::vector<HWND> handles;
auto result = EnumWindows(EnumWindowsProc,
reinterpret_cast<LPARAM>(&handles));
// Do the calls...
return scope.Close(Boolean::New(result == 1));
}