2014-03-06 40 views
3

我想连接一个变量,使我的输出“漂亮”,但它似乎输出为与其他字符串值连接时的空字符串。Lua字符串将不会连接

输出代码摘录如下:

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" 

输出:

Output

name的可变经由Alien for Lua呼叫从User32.dll设置为WINAPI SendMessage function。我认为这可能是问题的一部分,但正如你在上面看到的那样,变量被设置为键入(Lua)“string”,并在被自己调用时打印正确。但是,无论何时将它与任何东西连接起来,它都像空字符串(或类似的东西)一样。

编辑:我也试过tostring(name)alien.tostring(name)。这两者都不能解决问题。

+0

您是否尝试过'reallyualuatring = alien.tostring(name)'后跟'print(“标题:”.. reallyALuaString ..“\ n”)'? –

+0

它崩溃,错误“预期的用户数据,得到的字符串”。 – MrHappyAsthma

+1

Lua字符串是不可变的。虽然C API允许它们转换为const char *,但不允许修改它们的内容。外星人不能破坏该合约,最好它可以创建一个全新的Lua字符串来分配给变量,并且必须知道预先分配一个缓冲区以接收来自'SendMessage()'的结果。 – RBerteig

回答

3

大量的试验和错误之后,以及阅读Lua Alien documentation,我发现,使用Alien Buffer解决了混合动力C-Lua的字符串和一个原生的Lua字符串之间转换的问题:

local name = alien.buffer() 
print("Title: " .. name:tostring() .. "\n") 

你可以随时在变量上使用tostring()方法来获取本地Lua字符串。

注意:缓冲区变量将是userdata类型。如果你尝试自己打印出来,它会显示它的内容,但是如果你试图像串连接它(没有:tostring()),Lua会抛出一个错误,因为你不能连接stringuserdata