在lua中呼叫DLL

2021-10-05 19:21:02 字數 1978 閱讀 6026

整整的花了乙個下午的時候,才在lua中呼叫了動態鏈結庫。比起其他指令碼語言,lua的呼叫方式算是比較繁瑣的,但是lua的程式設計思想非常的統一,即lua和c之間的傳值都是通過棧進行的,目前為止我還沒有深入的去了解這個「棧」,但是這並不妨礙去使用」棧「。

當我們在乙個空的工程中寫下幾個c/c++的函式,然後把屬性型別設定為「動態鏈結庫」以後,編譯雖然成功了,dll也產生了,但是我們得到的dll是乙個沒有價值的資料檔案,它缺少export函式(通過dumpbin /exports ***.dll 觀察),我們的lua也無法使用它。為了把我們寫好的函式export出去,必須在函式名前,返回型別之後加上__declspec(dllexport),比如:

int add(int a, int b)

//要修改為--->>>

int __declspec(dllexport) add(int a , int b)

這是你就可以用dumpbin看到我們的add了。不對??是的,也行你看到的不是add,而是@ilt#$%^add(@$%) (我隨便寫個大概),那麼你的工程一定是c++工程。這樣的dll只能通過引導庫(lib)來實現,lua用不了。為了能建立lua可以使用的庫,必須在匯出函式的最前面加上extern "c" (不能是__stdcall),所以此時的函式變成了:

extern "c" int __declspec(dllexport) add(int a , int b)

還有一種常用的方法也可以得到extern的效果,那就是建立def檔案,例如:

library  mylib  

description "just for test"  

version 1.0

exports  

add有了def,你就不需要再每個函式前加上extern 「c」了。記得要在屬性/聯結器/輸入/模組定義檔案中輸入def的檔名稱。我們這個動態鏈結庫以及lua.exe必須動態的連線lua.dll (lua5.2.dll),而不能靜態的鏈結,否則你會得到錯誤:

stack traceback :

[c]:?

[c]:in function 'require'

test.lua:1:in main chunk

[c]:?

有了上面的知識鋪墊,我們可以進入下乙個環節了——讓lua呼叫dll。下面**可以生成乙個dll。

#include

extern "c"

static int mysin (lua_state *l) 

static int l_printf(lua_state *l)

static int l_messagebox(lua_state *l)

static const struct lual_reg mylib = ,,

,};extern "c" int __declspec(dllexport) luaopen_mylib(lua_state *l)

上面的**中,最後export出去的函式是luaopen_mylib,一定要注意:函式名luaopen_mylib表明了最後輸出的dll名稱必須為mylib.dll,而且大小寫要一致,否則lua無論如何都找不到luaopen_mylib函式的。我們可以在lua指令碼中這樣使用。

mylib = require("mylib")

mylib.printf("say: %s\n", "hello world")

msgbox = mylib.messagebox

msgbox("hello from luaopen_mylib")

另外,我要介紹一下另一種老方法。在dll**中新增:

extern "c" int  __declspec(dllexport) mymessagebox(lua_state *l)

你猜對了,我們要export另乙個函式,然後我們可以在lua中這樣用到:

pf = package.loadlib("mylib.dll","mymessagebox")

print(pf)

pf("hello", "again")

在ASP檔案中呼叫DLL

動態聯接庫 dll 是加快應用程式關鍵部分的執行速度的重要方法,但有一點恐怕大部分人都不知道,那就是在asp檔案也能通過呼叫dll來加快伺服器的執行速度,下面我簡單的介紹一下在asp檔案呼叫dll的步驟。首先,必須得有dll檔案,本例是通過vb5.0建立activex dll檔案,這個檔案模擬了乙個...

在ASP檔案中呼叫DLL

動態聯接庫 dll 是加快應用程式關鍵部分的執行速度的重要方法,但有一點恐怕大部分人都不知道,那就是在asp檔案也能通過呼叫dll來加快伺服器的執行速度,下面我簡單的介紹一下在asp檔案呼叫dll的步驟。首先,必須得有dll檔案,本例是通過vb5.0建立activex dll檔案,這個檔案模擬了乙個...

在ASP檔案呼叫DLL

動態聯接庫 dll 是加快應用程式關鍵部分的執行速度的重要方法,但有一點恐怕大部分人都不知道,那就是在asp檔案也能通過呼叫dll來加快伺服器的執行速度,下面我簡單的介紹一下在asp檔案呼叫dll的步驟。首先,必須得有dll檔案,本例是通過vb5.0建立activex dll檔案,這個檔案模擬了乙個...