整整的花了乙個下午的時候,才在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檔案,這個檔案模擬了乙個...