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
变量是通过调用from
User32.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()
的结果。