【问题标题】:Calling Win32 functions returning strings with alien in Lua在 Lua 中调用 Win32 函数返回带有外星人的字符串
【发布时间】:2010-09-21 07:22:55
【问题描述】:

我正在尝试使用alien 来调用 Win32 函数。我试过这段代码,但它崩溃了,我不明白为什么。

require( "alien" )

local f = alien.Kernel32.ExpandEnvironmentStringsA
f:types( "int", "string", "pointer", "int" )
local buffer = alien.buffer( 512 )
f( "%USERPROFILE%", 0, 512 )

【问题讨论】:

    标签: winapi lua


    【解决方案1】:

    这是一个很好的问题,对我来说,这是一个测试外星人的机会......

    如果你不介意的话,我借此机会解释一下如何使用Alien,所以像我这样的人(不太习惯require)偶然发现这个线程会开始......

    你给了 LuaForge 页面的链接,我去了那里,发现我需要 LuaRock 来获取它。 :-( 总有一天我应该安装后者,但我现在选择跳过它。所以我去了存储库并下载了alien-0.4.1-1.win32-x86.rock。 我发现这是一个普通的 Zip 文件,我可以像往常一样解压缩。

    在对require 进行了一番摸索之后,我最终破解了 Lua 脚本中的路径以进行快速测试。我应该在我的环境中创建LUA_PATHLUA_CPATH,我稍后会这样做。

    所以我从解压后的文件夹中取出了 alien.lua、core.dll 和 struct.dll 并将它们放在一个名为 Alien 的目录下的一个公共库存储库中。
    我在脚本的开头添加了以下几行(错误的黑客警告!):

    package.path = 'C:/PrgCmdLine/Tecgraf/lib/?.lua;' .. package.path
    package.cpath = 'C:/PrgCmdLine/Tecgraf/lib/?.dll;' .. package.path
    require[[Alien/alien]]
    

    然后我尝试了一个简单、简洁的功能,并立即获得视觉结果:MessageBox。

    local mb = alien.User32.MessageBoxA
    mb:types{ 'long', 'long', 'string', 'string', 'long' }
    print(mb(0, "Hello World!", "Cliché", 64))
    

    是的,我收到了消息框!但是单击确定后,我遇到了 Lua 崩溃,可能和您一样。 在快速浏览 Alien 文档后,我发现了(未命名的)罪魁祸首:我们需要使用 Windows API 的 stdcall 调用约定:

    mb:types{ ret = 'long', abi = 'stdcall', 'long', 'string', 'string', 'long' }
    

    因此,让您的工作变得微不足道:

    local eev = alien.Kernel32.ExpandEnvironmentStringsA
    eev:types{ ret = "long", abi = 'stdcall', "string", "pointer", "long" }
    local buffer = alien.buffer(512)
    eev("%USERPROFILE%", buffer, 512)
    print(tostring(buffer))
    

    注意我把buffer参数放在eev调用中...

    【讨论】:

    • 太棒了!你也可以使用 Lua for Windows (luaforwindows.luaforge.net)。它带有开箱即用的外星人。
    • 是的,虽然它是一个不错的包,但我不喜欢它的“包含所有电池”的理念,导致下载量比 Python 的大...
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 2011-03-08
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2022-01-18
    相关资源
    最近更新 更多