Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 调用Win32函数返回Lua中带有外来变量的字符串_Winapi_Lua - Fatal编程技术网

Winapi 调用Win32函数返回Lua中带有外来变量的字符串

Winapi 调用Win32函数返回Lua中带有外来变量的字符串,winapi,lua,Winapi,Lua,我正在尝试使用调用Win32函数。我试过这个代码,但它崩溃了,我不明白为什么 require( "alien" ) local f = alien.Kernel32.ExpandEnvironmentStringsA f:types( "int", "string", "pointer", "int" ) local buffer = alien.buffer( 512 ) f( "%USERPROFILE%", 0, 512 ) 这是一个好问题,因为对我来说,这是一个测试外星人的机会 如果

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

require( "alien" )

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

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

如果你不介意的话,我借此机会解释如何使用Alien,这样像我这样(不太习惯
要求
)在这个问题上遇到障碍的人就可以开始了

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

在摸索了一下
require
之后,我结束了对Lua脚本中的路径的黑客攻击,以进行快速测试。我应该在我的环境中创建
Lua_路径
Lua_CPATH
,我稍后会这样做

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

然后我尝试了一个简单的,没有虚饰的功能,并立即产生了视觉效果:MessageBox

local mb = alien.User32.MessageBoxA
mb:types{ 'long', 'long', 'string', 'string', 'long' }
print(mb(0, "Hello World!", "Cliché", 64))
是的,我收到了消息框!但单击“确定”后,我收到了Lua的崩溃消息,可能和你一样。 在快速扫描外来文档后,我发现了(未命名)罪魁祸首:我们需要对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调用中添加了缓冲区参数…

太好了!您也可以使用Lua for Windows()。它附带了现成的alien。是的,但尽管它是一个不错的软件包,但我不喜欢它的“包括所有电池”理念,导致下载量比Python的更大。。。
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))