require "calc"a = 5b = 10print(calc.sum(a,b))print(calc.average(a,b))
用户可以在luaopen_xxx函数中用capi做任何事情,但一般是用luaL_register注册一组函数到一个table中,并返回这个table
打开vs2008,新建 -> 项目 -> Visual C++ -> Win32 -> Win32项目 -> 输入项目名 calc
应用程序类型:DLL添加一个新的文件 calc.c (注意是 .c 不是.cpp ),源代码如下:
//包含3个lua头文件//如果本文件是cpp文件,则不要包含下面3个文件,而包含 lua.hpp 文件#include <lua.h>#include <lualib.h>#include <lauxlib.h>static int sum(lua_State *L) { lua_Number a = luaL_checknumber(L, 1); //检查第1个参数是数字,如果是则返回这个数字 lua_Number b = luaL_checknumber(L, 2); //检查第2个参数是数字,如果是则返回这个数字 lua_pushnumber(L, a+b); //返回值 return 1; //函数返回值个数}static int average(lua_State *L) { lua_Number a = luaL_checknumber(L, 1); //检查第1个参数是数字,如果是则返回这个数字 lua_Number b = luaL_checknumber(L, 2); //检查第2个参数是数字,如果是则返回这个数字 lua_pushnumber(L, (a+b)/2); //返回值 return 1; //函数返回值个数}static luaL_Reg module_functions[] = { {"sum", sum}, //函数名,函数 {"average", average}, {NULL, NULL} //结尾};//注意用__declspec(dllexport)输出函数//如果本文件是 cpp 文件,则必须加extern "C"__declspec(dllexport) int luaopen_calc(lua_State *L) { luaL_register(L, "calc", module_functions); //创建一个全局的calc table,所有函数都会按照指定名称注册成calc table的成员函数 return 1; //luaopen_calc也是一个luc_CFunction,返回返回值的个数,返回值是由luaL_register压入栈的}
生成release版的calc.dll,然后在calc.dll所在目录,新建一个 test.lua文件,把本文目标(上面)中的lua源程序拷进去,运行!结果正确!!
如果需要长期使用calc.dll,则可以将它拷贝到luaforwindows的clibs文件夹中,比如C:\Program Files\Lua\5.1\clibs
到此为止,我们已经掌握了用VS写lua C模块的基本方法了,下一篇文章,讲讲自己让luacom能够打开中文的word文件。
联系客服