【问题标题】:Lua alien returning multiple valuesLua 外星人返回多个值
【发布时间】:2012-12-27 00:24:05
【问题描述】:

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

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

    if kernel32.GetDiskFreeSpaceExA(_disk, _avail_space, _disk_space, _free_space) ~= 0 then
            return _avail_space, _disk_space, _free_space
            --[[or like this return kernel32.GetDiskFreeSpaceExA(_disk, _avail_space, _disk_space, _free_space)
            GetDiskFreeSpaceExA should retun non zero if function ran properly, 
            and should retun additional values if those are given 
            (btw values are __int64 i'm not sure if I specified them correct, maybe
            I should set them as "long" instead of "int")
            either way it return only function value and nil's.
            --]]
    else
            print("GetDiskSpace returned error.")
    end
end

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

【问题讨论】:

    标签: lua calling-convention


    【解决方案1】:

    您给出的类型说明是错误的,原因有几个。第一个参数的类型是 "string" 而不是 "pointer"。你必须写"ref int" 而不仅仅是"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 位整数的支持。

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 2010-09-21
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多