2013-05-12 54 views
5

我正在Delphi中創建一個函數,以便能夠與Lua一起使用它。 我已經設法創建了一個程序(或者沒有結果的函數),它的工作原理是完美的。 問題是,現在我想從德爾福到Lua獲得該功能的結果(不再是一個程序)。 我已經閱讀了一些代碼,但無法使其工作。如何從德爾塔函數調用Lua的結果

我的功能看起來是這樣的:

function TLuaScripter.getsetting(LuaState: TLuaState):TluaState; 
var 
path,stri: string; i:integer; 
begin   //getsetting('Targeting/TargetingEnabled') 

path := Lua_ToString(LuaState, 1); //we get the string 'Targeting/..." 

Lua_Pop(LuaState,1); //we put it in stack (so we can clean it) 

stri:= tree.GETsetting(path); //this function gets, for example "No" 

lua_pushlstring(LuaState,Pansichar(ansistring(stri)),length(stri)); //I pass it to the lua stack 

//showmessage(Lua_ToString(LuaState,1));--> this shows the result I need in a msgbox 

result:= LuaState; 
end; 

所以現在,如果我在的Lua控制檯

getsetting('Targeting/TargetingEnabled') 

使用我能夠得到的結果在一個MsgBox(在取消對「Showmessage .. 。「),但該函數在Lua中不返回任何內容!如果我寫

print(getsetting('Targeting/TargetingEnabled')) 

我在Lua中得到一個無值。

+2

您應該註冊類型的函數'lua_CFunction'返回結果數量推入堆棧。因此,將返回類型更改爲'Integer'並正確設置返回值'result:= 1;'。順便說一句,用'lua_pop'清理堆棧是可選的。 – 2013-05-12 22:46:02

+1

正確函數聲明的示例:'函數getsetting(L:Plua_State):Integer; cdecl;' – 2013-05-12 22:49:17

+0

我已經完成了以下操作: - 將返回類型從TLuaState更改爲Integer。 - 將結果值更改爲1. - 我也刪除了lua_pop,正如您所說的 它現在正在工作,就像那樣,但它不適用於函數中的「cdecl」。爲什麼需要? 關於「lua_CFunction」,爲什麼我們需要這個,如果我實際上可以打印像「print(getsetting(...))」這樣的值? 感謝您的幫助。 – user2308704 2013-05-13 11:48:34

回答

1

它將與此完美結合。我們剛纔添加的結果作爲整數和「的結果:= 1」

function TLuaScripter.getsetting(LuaState: TLuaState): integer; 
var 
    path,stri: string; 
    i: integer; 
begin   //getsetting('Targeting/TargetingEnabled') 
    path := Lua_ToString(LuaState, 1); 
    stri:= tree.GETsetting(path); 
    lua_pushlstring(LuaState,Pansichar(ansistring(stri)),length(stri)); 
    result:= 1; 
end;