Chinaunix首页 | 论坛 | 博客
  • 博客访问: 226952
  • 博文数量: 56
  • 博客积分: 2480
  • 博客等级: 大尉
  • 技术积分: 475
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-28 10:57
文章分类

全部博文(56)

文章存档

2012年(36)

2011年(4)

2010年(2)

2009年(14)

我的朋友

分类: Python/Ruby

2012-03-01 10:58:55

C代码:

  1. #include "windows.h"     
  2. #include        
  3.   
  4. extern "C"{        
  5. #include "lua.h"         
  6. #include "lualib.h"       
  7. #include "lauxlib.h"        
  8. }       
  9.   
  10.   
  11. #pragma   comment(lib,"lua5.1.lib")       
  12.   
  13.   
  14. lua_State * L;     
  15.   
  16. static int foo (lua_State *L) {  
  17.     const char *buff = luaL_checkstring(L, -1);   
  18.     printf(buff);  
  19.     return 0;                   /* number of results */  
  20. }  
  21.   
  22. static int clib(lua_State *L)   //给lua调用的c函数必须定义成static int XXX(lua_State *L)       
  23. {       
  24.     const char *buff = luaL_checkstring(L, -1);     
  25.     //从栈顶弹出一个值     
  26.     lua_pop(L, 1);       
  27.     //lua_pop(L, -1); //清栈     
  28.       
  29.     //创建索引并从栈顶弹出该对象     
  30.     int ref = luaL_ref(L, LUA_REGISTRYINDEX);      
  31.     //根据索引取lua对象并压栈     
  32.     lua_rawgeti(L, LUA_REGISTRYINDEX, ref);     
  33.     if (!lua_isfunction(L, -1))     
  34.     {     
  35.         printf("call back function is not valid:%d", ref);     
  36.         return 0;     
  37.     }     
  38.     //压入参数     
  39.     lua_pushstring(L, buff);  
  40.     lua_pushcfunction(L, (lua_CFunction)foo);  
  41.   
  42.     //运行     
  43.     lua_pcall(L, 2, 0,0);     
  44.     const char * err = luaL_checkstring(L, 1);     
  45.     printf("%d,err:%s/n", lua_gettop(L),  err);     
  46.     luaL_unref(L, LUA_REGISTRYINDEX, ref);     
  47.     return 0;   //为什么要返回1?这是有依据的,该函数把结果压入了栈,lua调用该函数将从栈中       
  48.     //取1个结果  */     
  49. }       
  50.   
  51.   
  52. static const luaL_reg lengine[] = {     
  53.     {"clib", clib},     
  54.     {NULL, NULL},     
  55. };     
  56.   
  57.   
  58. int main()  
  59. {  
  60.     //创建一个指向lua解释器的指针       
  61.     L = luaL_newstate();       
  62.     //加载lua标准库       
  63.     luaL_openlibs(L);       
  64.     //注册C++函数       
  65.     lua_register(L,"clib",clib);       
  66.     //加载脚本       
  67.     luaL_register(L, "lengine", lengine);     
  68.     luaL_dofile(L,"1.lua");       
  69.     //调用函数       
  70.     // lua_getglobal(L,"run");       
  71.     //运行函数并把结果压入栈       
  72.     // lua_pcall(L,0,0,0);       
  73.     //关闭并释放资源       
  74.     lua_close(L);     
  75.     return 0;      
  76. }  

 

 

lua代码:

[python] view plaincopy
  1. local b = {}  
  2. function b.a(str, cfunc)  
  3.     print("OK")  
  4.     print("lua" .. str)  
  5.      cfunc("this is c function/n")  
  6. end  
  7.   
  8. lengine.clib(b.a, "test")  

阅读(1828) | 评论(0) | 转发(0) |
0

上一篇:Lua学习笔记二

下一篇:string 分割方法

给主人留下些什么吧!~~