您的位置:首页 > 电脑网络 > 电脑配件 > lua脚本调用二进制dll

lua脚本调用二进制dll

luyued 发布于 2011-02-07 23:47   浏览 N 次  

lua脚本可以调用二进制的dll,看一下lua的源码就理解了,本质上和lua调用exe的注册函数是一样的.相关要认识的要点如下:

1.lua脚本只能调用dll中的指定函数,而不是整个DLL.
2.lua调用的函数必须满足lua注册函数的特定格式.
3.lua 5.1后使用package.loadlib.当然以后会不会变是另回事了.

基本过程,那我开始讲吧:

1.新建个dll工程.加入lua支持,总之你能让编译通过即可.
//---------------test.dll-----------------
//标准定义宏
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
//lua支持
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#pragma comment(lib,"LuaXX.lib")
//函数定义与实现
extern "C" MYDLL_API int LuaDllFunc(lua_State* L)
{
lua_pushstring(L,"Load LuaDllFunc :)");
return 1;
}
//----------------------------------------


2.在lua脚本中调用.下文中,func实际只是函数指针,实际调用请加()及相关参数.
-- ----------loaddll.lua------------------
local func = package.loadlib("test.dll","LuaDllFunc")
if type(func)=="function" then
print(func())
end
-- ---------------------------------------
3.在标准程序lua.exe中调用,输入dofile("loaddll.lua")就完事了.

扩展方式:
网上有个扩展方式,本质上是使用了lua的openlib自定义lib的功能,写在这里很容易误导学习者对lua调用dll的理解,但这种方式比较类似 dll的一些特性,对于习惯用dll的人来说不失为一种好的做法,所以我放在后面.这种扩展不是必须的.如果你不想用,大可不必看.


//扩展......
static int AFuncIns (lua_State *L)
{
lua_pushstring(L,"Load AFuncIns :)");
return 0;
}

static const struct luaL_reg mylibary [] = {
{"AFunc", AFuncIns},
{NULL, NULL}
};

extern "C" MYDLL_API int luaopen_mylib (lua_State *L)
{
luaL_openlib(L, "mylib", mylibary, 0);
return 1;
}
//end

-- lua脚本调用
local func = package.loadlib("test.dll", "luaopen_mylib")
if type(func)=="function" then
func()
end
-- 以后就可以用mylib这个脚本函数库了.
mylib.AFunc()
-- end

图文资讯
广告赞助商