Lua外星人返回多个值

我有这个函数,我想返回多个值,但我不知道如何实现

``` function GetDiskSpace(_disk) require("alien") local kernel32 = alien.load("kernel32.dll") kernel32.GetDiskFreeSpaceExA:types("int", "pointer", "int", "int", "int")

如果 kernel32.GetDiskFreeSpaceExA(_disk, _avail_space, _disk_space, _free_space) ~= 0 then
    return _avail_space, _disk_space, _free_space
    --[[或者这样返回 kernel32.GetDiskFreeSpaceExA(_disk, _avail_space, _disk_space, _free_space)
    如果函数运行正常 GetDiskFreeSpaceExA 应返回非零值,
    并且如果给定了其他值,则应返回这些值
    (顺便说一下,这些值是 __int64 类型,我不确定我是否正确地指定了它们,也许
    我应该将它们设置为 "long" 而不是 "int")
    无论哪种方式,它只返回函数值和 nil。
    --]]
else
    print("GetDiskSpace 返回错误。")
end

end

hdd_a,hdd_b,hdd_c = GetDiskSpace("C:\")

点赞
用户1008957
用户1008957

你提供的类型说明存在若干问题。第一个参数的类型为"string"而非"pointer"。对于指向int的引用(或指针)应该写成"ref int",而不仅仅只是"int"。你还必须将 ABI 指定为"stdcall"

在使用"ref int"参数调用函数时,你传递了一个虚拟值 0,但会得到额外的返回值,因此GetDiskFreeSpaceExA实际上会返回 4 个结果。

你担心这些结果的类型可能是uint64_t。据我所知,Alien不支持64位整数,因此以下代码仅返回磁盘空间的32位下半部分:

function GetDiskSpace(_disk)
    require("alien")
    local kernel32 = alien.load("kernel32.dll")
    kernel32.GetDiskFreeSpaceExA:types { ret="int", abi="stdcall",
        "string", "ref int", "ref int", "ref int" }
    local ok, _avail_space, _disk_space, _free_space =
        kernel32.GetDiskFreeSpaceExA(_disk, 0, 0, 0)
    assert(ok == 1, "GetDiskSpace returned error.")
    return _avail_space, _disk_space, _free_space
end

hdd_a, hdd_b, hdd_c = GetDiskSpace("C:\\")

为了纠正这个问题,你可以修改 Alien 的源代码并重新构建它,以此添加对64位整数的支持。

2012-12-26 16:24:05