gpt4 book ai didi

c++ - 如何将 Local 作为参数传递?

转载 作者:太空宇宙 更新时间:2023-11-04 11:35:19 24 4
gpt4 key购买 nike

我正在使用 v8 为 node.js 编写 C++ 库。我在 Windows 上,我想调用一个 Win32 API 函数,EnumWindows ,来 self 的 C++ 代码。 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在同一个线程中执行。

最佳答案

您可以传递回调的地址:

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));
}

关于c++ - 如何将 Local<Function> 作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23225072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com