代码之家  ›  专栏  ›  技术社区  ›  Jacob Birkett

使用嵌套函数作为Windows API函数的回调?

  •  1
  • Jacob Birkett  · 技术社区  · 7 年前

    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) => {} .

    我试过这个,但我得到的签名错误,它说,该函数是一个委托,显然WindowsAPI不能接受委托。

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

    我甚至不打算粘贴编译器错误,因为我显然是用错误的方法来处理的。

    当然,将每个回调定义为一个单独的函数并没有错,但是接下来的问题是如何命名它们。我也不喜欢它让我的代码看起来。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jacob Birkett    7 年前

    我发现我可以将委托(或lambda)强制转换为MSDN文档指定的正确签名 EnumWindowsProc .

    hWndList

    这是我用来创建正确的签名。

    alias EnumWindowsProc = extern (Windows) int function(HWND, LPARAM) nothrow;
    

    ENUMWINDOWSPROC 在MinGW headers的 core.sys.windows.windows 在第2483行(写作时)。

    extern (Windows) nothrow {
        ...
        alias BOOL function(HWND, LPARAM) ENUMWINDOWSPROC;
        ...
    }
    

    为了解决隐式传递D的框架的问题,我使用 cast(LPARAM) &hWndList lParam EnumWindows

    这就成了现在使用指针的问题。我知道这可能是拙劣的,任何建议欢迎,但我把它扔到一个指针。

    *(cast(HWND[]*) lParam)
    

    完整的代码是这样的。很明显,这只是一个很小的例子,所以您可能希望将casted指针赋给某个对象,这样在使用中的变量时就不那么容易混淆了 lParams .

    import core.sys.windows.windows: EnumWindows, ENUMWINDOWSPROC;
    import std.stdio: writeln;
    
    void main() {
        HWND[] hWndList;
    
        EnumWindows(cast(ENUMWINDOWSPROC) (HWND hWnd, LPARAM lParam) {
            *(cast(HWND[]*) lParam) ~= hWnd;
            return true;
        }, cast(LPARAM) &hWndList);
    
        writeln(hWndList);
    }
    

    我希望这能帮助一些人,因为这让我非常困惑(仍然不确定我是否理解指针逻辑)。

    https://forum.dlang.org/post/xxklxaajptppockvazeo@forum.dlang.org