2011-11-30 69 views
4

我想在我的Delphi應用程序中啓用Lua-Scripting(Lua 5.1)。爲此,我使用Thomas Lavergne的頭文件。替換爲luaL_getMetaTable

現在我嘗試註冊下面這個例子中用戶數據類型:http://www.lua.org/pil/28.2.html

在「新的數組功能」,它使用的命令* luaL_getmetatable *。

static int newarray (lua_State *L) { 
    int n = luaL_checkint(L, 1); 
    size_t nbytes = sizeof(NumArray) + (n - 1)*sizeof(double); 
    NumArray *a = (NumArray *)lua_newuserdata(L, nbytes); 

    luaL_getmetatable(L, "LuaBook.array"); 
    lua_setmetatable(L, -2); 

    a->size = n; 
    return 1; /* new userdatum is already on the stack */ 
} 

不幸的是* luaL_getmetatable *函數在我的頭文件中被標記爲舊的並且註釋掉了。我試圖再次激活它,但如預期,我會得到一個錯誤,因爲無法找到DLL入口點。

這是一個例子的德爾福平移(使用其他非數組類型)

Type 
    tMyType = tWhatever; 
    pMyType = ^tMyType; 
{...} 

Function newusertype(aState : pLua_State) : LongInt; cdecl; 
    Var 
    NewData : pMyType; 
    Begin 
    Result := 0; 
    NewData := lua_newuserdata(aState, SizeOf(tMyType)); 
    NewData^ := GetInitValue; 
    luaL_getMetaTable(aState, 'myexcample.mytype'); // Error/unknown function 
    lua_setmetatable(aState, -2); 
    Result := 1; 
    End; 

現在我正在尋找一個替代luaL_getMetaTable的。我還沒有找到任何關於其中的信息。其實我還沒有發現任何信息luaL_getMetaTable已經過時,但它似乎是:(。

+1

你可以試試這個[lua-5-1-for-delphi-2010](http ://blog.spreendigital.de/2009/09/28/lua-5-1-for-delphi-2010/)包裝器或其他列在這裏[BindingCodeToLua](http://lua-users.org/wiki/ BindingCodeToLua)。 –

+0

感謝您使用「BindingCodeToLua」鏈接。我已經回顧了大部分Delphi相關的包裝器。他們中的大多數人的表現會與托馬斯·拉維涅相同或者更少,但Lua4Delphi的例子和「擴展」很有趣。 –

回答

3

使用lua_newmetatable(aState, 'myexample.mytype')。事情是(如果你只是想繼續,如果元表已經存在)你需要以評估其是否會返回一個0!如果它返回0,那麼它想要創建的元表......在這種情況下,你可以lua_pop(aState, 1)

只要記住,lua_newmetatable是返回一個整數(這在現實中應該是一個功能布爾)

否則,您可以等待幾個星期讓我發佈Lua4Delphi版本2,這使得這一切超級容易(和專業版實際上自動註冊德爾型和實例與Lua

+1

thx,我會密切關注你的項目。完成後可能會成爲一個選項。 –

+0

不用擔心!圖書館和所有包裝單位100%免費!核心是封閉的源碼,但包裝單元是完全開源的。 不是我想做廣告,但它可能對您真正有用:知道我正在籌款(有點像預購事件以資助發展)......您可以獲得全面的專業許可£50 :) – LaKraven