2014-01-22 172 views
0

我在這方面找到了一些參考,但是我無法使它們工作。我有一個Debian框與MySQL和MySQL代理。我正在用LUA腳本攔截SQL查詢。從lua腳本中調用c函數

function read_query(packet) 
     if packet:byte() ~= proxy.COM_QUERY then 
       print("error read (COM_QUERY)") 
     end 
    local query = packet:sub(2) 
    print ("query : " .. query) 
      //Transformation here 
    return proxy.PROXY_SEND_QUERY 
end 

我想解析和處理查詢,所以我可以用我已經開發的一些c函數來重寫它。我試圖找到調用這個函數的方法,但是我發現唯一的方法是使用c MAIN函數啓動LUA註冊過程。

有什麼辦法可以讓LUA腳本在編譯的C文件中調用該函數嗎?

任何我應該如何使(LUA)和接收(C)呼叫的例子?

回答

0

摘自lua.org

當我們說的Lua可以調用C函數,這並不意味着Lua中可以調用任何C函數。(有包,允許Lua中調用任何C功能,但它們既不便攜也不健壯)... ... ...對於從Lua調用的C函數,我們必須註冊它,也就是說,我們必須以適當的方式將它的地址給Lua。

你應該看看here

+0

如果我理解正確,我有一個循環問題:調用一個C函數我首先需要調用一個C函數來註冊它。看起來我的方式應該是將我的代碼構建爲一個模塊,不是嗎?有沒有什麼好的例子或教程來做到這一點? – jordi

+0

@ user2935222是的,如果你需要從獨立的Lua調用一個C函數,你需要創建一個C模塊或者使用提到的「非強健」軟件包之一:http://www.lua.org/pil/和http://lua-users.org/wiki/BindingCodeToLua(如果你想採用「非強健」的方式尋找「FFI」) – dualed

0

痛飲是爲您生成綁定一個很好的選擇:www.swig.org。你創建一個加載C頭文件的.i文件,並且SWIG爲你生成所有的綁定代碼。然後你編譯生成的代碼,將它鏈接到你的C庫和Lua庫,並且在你放入的腳本中需要'yourCLibrary',你可以做你想做的。非常實用,你的包裝器可以用來從其他語言如Python和C#訪問你的CLibrary。