在Lua中使用自己的C函数

转载 2012年03月30日 17:53:38

-------以下是Lua脚本--------
--test.lua
LuaC_MessageBox( "Last is ShowMessage! This is real MessageBox!");
---------通过LuaEdit语法测试才出鬼了--------------

//------------以下是test.cpp文件----------------
//================================================================================================================
//Lua Test Object
//C++ Source lua_test.cpp
//================================================================================================================
//================================================================================================================
//Include Files
//================================================================================================================
extern "C"
{
#include "D:\\My Documents\\Visual Studio 2005\\Projects\\lua\\lua\\lua.h"
#include "D:\\My Documents\\Visual Studio 2005\\Projects\\lua\\lua\\lualib.h"
#include "D:\\My Documents\\Visual Studio 2005\\Projects\\lua\\lua\\lauxlib.h"
}

#include <windows.h>
#include <stdio.h>
#include <string>
using namespace std;
//================================================================================================================
//Libraries
//================================================================================================================
#pragmacomment( lib ,"D:\\My Documents\\Visual Studio 2005\\Projects\\lua\\release\\lua.lib")
//================================================================================================================
//Global Variables
//================================================================================================================
lua_State *L;
//================================================================================================================
//Lua Functions
//================================================================================================================
double f( double x, double y )
{
double ret;
lua_getglobal( L, "f");
lua_pushnumber( L,x);
lua_pushnumber( L,y);
lua_call( L, 2, 1);
//lua_pcall( L, 2, 1, 0);

ret = lua_tonumber( L, -1);
//lua_pop( L, 1);
return ret;
}
//================================================================================================================
//C/C++ Functions
//================================================================================================================
int LuaC_MessageBox( lua_State *L)
{
char Message[256] = "";
int i;

// 获取参数个数
int n = lua_gettop(L);

// 保存全部参数
for ( i = 1, j = 0; i <= n ; i++)
{
if( lua_isstring( L, i))
strcpy( Message, lua_tostring( L, i));
}

// 执行逻辑
MessageBox( NULL, Message,"Lua Test", MB_OK);

// 返回值压栈

// 返回压栈参数的个数
return 0;
}
//================================================================================================================
//Main Functions
//================================================================================================================
int main( void)
{
int error;

L = lua_open();
luaopen_base(L);
luaL_openlibs(L);

// 注册C/C++函数
lua_register( L, "LuaC_MessageBox", LuaC_MessageBox);



// load the script
// 加入了错误处理
if ( (error = luaL_dofile(L, "test.lua")) != 0)
{
MessageBox( NULL, "出错啦:执行脚本出错!","Lua Test", MB_OK);
return 0;
}


getchar();
lua_close( L);
return 1;
}


额....这就是系列文章的好处:即使CSDN把原来的弄丢了,我也可以根据上下文来重写丢失的文章。

如你所见,我将关键点全部标记为粗体。并且给出了足够的注释。让我们来一条条梳理:

1、LuaC_MessageBox( "Last is ShowMessage! This is real MessageBox!");
这就是Lua脚本调用自己写的函数。让我们接着看如何实现这个函数的。

2、int LuaC_MessageBox( lua_State *L)
这个就是函数的实体了,要想使自己的函数被Lua脚本所用,必须遵守以下规则:
使用 int 函数名( lua_State *L) 的形式来声明和定义函数。
使用Lua的堆栈来进行参数交换。
调用Lua的注册函数。

3、关于第2个规则,Lua是按照 __fastcall 的规则传递参数的,也就是从左到右一个个传。
Lua压栈的顺序是:首先将函数压栈,然后将参数压栈。执行完毕后,将参数和函数都出栈,然后将返回值按顺序压栈。当然,还有很多类似的参数交换规则,不过别急我们慢慢来。

4、retrun 0;
在C函数中的返回值 指的是返回值的数量。因为Lua脚本是支持多个返回值的,结合上条和这条规则来实现。

5、C文件中的函数体编写完了,还需要将该函数进行注册,如:
lua_register( L, "LuaC_MessageBox", LuaC_MessageBox);
第二个参数为Lua脚本中的函数名,第三个为C文件中的函数名。

6、还有什么是我没涉及到的?返回值压栈!但是我想暂时不谈这个问题,因为我将(已经)在笔记四中详细讨论。所以,先熟悉这个基本流程。

7、OK。重写的好处在于:我可以直接把笔记四的东西搬过来。哈哈,又一次时间旅行。
Lua中有很多把各类返回值压栈的函数,只要你在Lua参考手册中搜索“lua_push”,你可以得到如下结果:
lua_pushboolean
lua_pushinteger
lua_pushfstring
lua_pushlstring
lua_pushnil
lua_pushnumber
.....
有很多这样的函数,解释可以参看参考手册(一定要看!)。
但是在这个例子中,我们没有返回值,所以retrun 0。

Lua调用C函数:tolua++ 的使用

C与lua交互时通过栈的方式来完成,lua调用C函数时,需要同样的通过压栈出栈来完成数据交互。 使用tolua++,简化这个流程,我们可以方便的让lua调用C,原理是通过pkg文件定义C暴露给lua...

lua调用C/C++函数

  • 2014年08月27日 17:02
  • 1KB
  • 下载

Lua中调用C函数

  • 2013年02月11日 22:48
  • 67KB
  • 下载

快速掌握Lua 5.3 —— 编写提供给Lua使用的C库函数的技巧 (1)

Q:如何在C库函数中灵活的操作Lua的”table”?A:--[[ void lua_settable(lua_State *L, int index); 从虚拟栈中"index"处获得"t...

Lua5.3——C API函数

这里按字母次序列出了所有C API中的函数和类型。每个函数都有一个这样的提示:[-o, +p, x] 对于第一个域,o,指的是该函数会从栈上弹出多少个元素。第二个域,p,指该函数会将多少个元素压栈。...

window下LUA调用C函数(动态库)

DESC:WIN7下 LUA调用C动态库 Author:dingwood Date:2012-02-11 21:34       1 概述 本文主要描述在WINDOW系统下LUA如何调用...

Lua中调用C/C++函数

Lua中调用C/C++函数   上次偶说到从C/C++中调用Lua的函数, 然后就有朋友问从Lua中如何调用C/C++的函数, 所以偶们这次就来说说这个问题. 首先偶们会在C++中建立一...

在C中调用Lua作配置文件和响应函数

Lua是脚本语言,最大的优势就是轻巧灵便,不用编译。当C的框架写好,只要更改lua的相应处理即可以更改功能,并且不用重新编译。以下是在C中调用Lua资源方法的示例程序:   C++端:   /...

Lua C API中文函数手册

转自http://www.leeon.me/a/lua-c-api-manual lua_Alloc typedef void * (*lua_Alloc) (void *ud, ...

Lua_第25章 调用 C 函数

扩展 Lua 的基本方法之一就是为应用程序注册新的 C 函数到 Lua中去。 当我们提到 Lua 可以调用 C 函数,不是指 Lua 可以调用任何类型的 C 函数(有一些包可以让 Lu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Lua中使用自己的C函数
举报原因:
原因补充:

(最多只允许输入30个字)