【发布时间】:2018-10-01 20:31:11
【问题描述】:
我有以下代码,这行得通。
import core.sys.windows.windows: EnumWindows;
import std.stdio: writeln;
void*[] hWndList;
extern (Windows) int callback(void* hWnd, long /* lParams */ ) nothrow {
hWndList ~= hWnd;
return true;
}
void main() {
EnumWindows(&callback, 0);
writeln(hWndList);
}
我希望我可以使用更类似于 JavaScript 的语法:(void* hWnd, long) => {}。
我试过了,但我收到了签名错误,它说函数是一个委托,显然 Windows API 不能接受委托。
import core.sys.windows.windows: EnumWindows;
import std.stdio: writeln;
void main() {
void*[] hWndList;
EnumWindows((void* hWnd, long /* lParams */ ) nothrow {
hWndList ~= hWnd; return true;
}, 0);
writeln(hWndList);
}
我什至不打算粘贴编译器错误,因为我很清楚这是错误的方式。
当然,将每个回调定义为单独的函数并没有错,但随之而来的是命名它们的问题。我也不喜欢它使我的代码看起来的方式。
谢谢。
【问题讨论】:
-
我建议你尝试一个嵌套的静态函数。我可以稍后再写,不确定它是否允许 extern(Windows) 作为嵌套函数,但它可能会,然后您可以在调用之前的行上定义并在此处使用它
-
回调必须严格遵守预期的签名。您的嵌套(如 c++ lamda)函数与此签名不匹配。因为嵌套函数实际上是某个未命名对象上的成员函数,并且它具有额外的隐藏参数(如 this ) - 你真的如何在回调中访问
hWndList?因为指向此局部变量的指针保存在您本地回调的隐藏本地对象中。无论如何,您需要静态函数作为回调。可能在本地对象上,但静态
标签: function winapi callback window d