当前位置:  开发笔记 > 编程语言 > 正文

调用Win32函数在Lua中使用alien返回字符串

如何解决《调用Win32函数在Lua中使用alien返回字符串》经验,为你挑选了1个好方法。

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

require( "alien" )

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

PhiLho.. 11

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

如果你不介意,我借此机会解释如何使用Alien,所以像我这样的人(不习惯require)绊倒这个帖子就会开始...

你给了LuaForge页面的链接,我去了那里,看到我需要LuaRock才能得到它.:-(有一天我应该安装后者,但我现在选择跳过它.所以我去了存储库并下载了外星人-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))

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



1> PhiLho..:

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

如果你不介意,我借此机会解释如何使用Alien,所以像我这样的人(不习惯require)绊倒这个帖子就会开始...

你给了LuaForge页面的链接,我去了那里,看到我需要LuaRock才能得到它.:-(有一天我应该安装后者,但我现在选择跳过它.所以我去了存储库并下载了外星人-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))

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

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有