Winapi 卢亚字符串赢得';t串联
我试图连接一个变量以使我的输出“更漂亮”,但是当与其他字符串值连接时,它似乎输出为空字符串 输出代码摘录如下所示:Winapi 卢亚字符串赢得';t串联,winapi,lua,printf,lua-alien,Winapi,Lua,Printf,Lua Alien,我试图连接一个变量以使我的输出“更漂亮”,但是当与其他字符串值连接时,它似乎输出为空字符串 输出代码摘录如下所示: local name = "" local SendMessage = alien.User32.SendMessageA SendMessage:types{ret = "int", abi = "stdcall", "pointer", "int", "int", "string"} SendMessage(handle, LB_GETTEXT, index, name)
local name = ""
local SendMessage = alien.User32.SendMessageA
SendMessage:types{ret = "int", abi = "stdcall", "pointer", "int", "int", "string"}
SendMessage(handle, LB_GETTEXT, index, name)
print(type(name)) --To verify that it is a string type
print(name) --Prints the name "Sample 1" perfectly fine
print("Title: " .. name .. "\n") --Doesn't print the name variable "Sample 1"
输出:
name
变量是通过调用fromUser32.dll
来设置的。我认为这可能是问题的一部分,但是正如您在上面所看到的,变量被设置为type(Lua)“string”,并且在自己调用时可以很好地打印。但是,无论何时将其与任何内容连接起来,它的行为都类似于空字符串(或类似的内容)
编辑:我也尝试了
tostring(名称)
和alien.tostring(名称)
。这两种方法都不能解决问题。经过大量的尝试和错误以及阅读后,我发现使用外来缓冲区解决了混合C-Lua字符串和本机Lua字符串之间的转换问题:
local name = alien.buffer()
print("Title: " .. name:tostring() .. "\n")
然后,您可以随时对变量使用tostring()
方法来获取本机Lua字符串
注意:缓冲区变量的类型为userdata
。如果您尝试自行打印,它将显示其内容,但是如果您尝试将其像字符串一样连接(没有:tostring()
),Lua将抛出错误,因为您无法将字符串
与用户数据
连接,您是否尝试过reallyALuaString=alien.tostring(name)
后跟打印(“Title:“…reallyALuaString…”“\n”)
?它因错误“预期的用户数据,获取字符串”而崩溃“.Lua字符串是不可变的。尽管C API允许将其转换为const char*
,但不允许修改其内容。Alien不能破坏该约定,它最多可以创建一个全新的Lua字符串来分配给变量,并且它必须知道预先分配一个缓冲区以接收来自SendMessage()
的结果。