`
lobin
  • 浏览: 425051 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

lua

 

C

 

C++

 

C/C++与LUA相互交互调用

 

C/C++中嵌入LUA脚本

 

#include <stdio.h>

#include <string.h>

#include <log.h>

#include "../gs/LuaContext.hpp"

#include "../gs/LuaExecutor.hpp"

#include "../gs/LuaScriptExecutor.hpp"

/*

#include <lua.h>

#include <lualib.h>

#include <lauxlib.h>

*/

#include "../LinkedLibrary.h"

 

#define BUFSIZE 1024

 

LuaContext *luaContext;

char *strEventHandler = NULL;

 

 

/**

 * LuaGlue 函数原型

 * 

 *     int (__cdecl *)(struct lua_State *) 

 * 

 * 如果在C编译环境下,函数定义可以不严格遵循这种原型。

 */

int __lua_version(struct lua_State *L)

{

printf("int __lua_version(struct lua_State *L)\n");

 

puts(LUA_VERSION);

puts(LUA_COPYRIGHT);

puts(LUA_AUTHORS);

return 0;

}

 

int registerEvent(struct lua_State *L)

{

printf("registerEvent()\n");

return 0;

}

 

int registerEventHandler(struct lua_State *L) 

{

strEventHandler = (char *) luaContext->getStringArgument(1);

info("lua event handler %s registered\n", strEventHandler);

return 0;

}

 

void FireEvent(char* event, ...)

{

char callback[254];

sprintf(callback, "%s(\"%s\")", strEventHandler, event);

 

lua_State *luaHandle = luaContext->getLuaContext();

//lua_dostring(luaHandle, script);

luaL_dostring(luaHandle, callback);

}

 

int main(int argc, char *argv[])

{

luaContext = new LuaContext();

lua_State *L = NULL;

char line[BUFSIZE];

int len;

 

puts(LUA_VERSION);

puts(LUA_COPYRIGHT);

puts(LUA_AUTHORS);

 

/*

//luaContext = lua_open(); // #define lua_open()luaL_newstate()

L = luaL_newstate(); // 创建一个解释器句柄

 

luaL_openlibs(L); // 打开所有的Lua库

//info("lua runtime environment opened");

*/

L = luaContext->getLuaContext();

 

lua_register(L, "__lua_version", __lua_version);

luaContext->registerFunction("registerEvent", registerEvent);

luaContext->registerFunction("registerEventHandler", registerEventHandler);

 

 

printf("Type lua script from stdin terminal, and the script typed would be executed.\n");

printf("Usage: \n");

printf("\tType <Enter> to exit stdin\n");

while(fgets(line, sizeof(line), stdin) != 0) 

{

if (line[0] == '\n')

{

break;

}

len = strlen(line);

printf("lua script length: %d\n", len);

printf("executing %s\n", line);

 

//lua_dostring(L, line); 

//luaL_dostring(L, line);

LuaScriptExecutor et(luaContext, line, 0);

et.execute();

 

memset(line, 0, BUFSIZE);

}

printf("exit stdin terminal\n");

 

 

//luaL_dostring(L, "print(\"this is lua output\")");

LuaExecutor *executor = new LuaScriptExecutor(luaContext, "print(\"this is lua output\")", 0);

executor->execute();

delete executor;

 

printf("第一种方式:\n");

//luaL_loadfile(L, "test.lua"); // 调入Lua脚本文件

//luaContext->load("test.lua");

//lua_pcall(L, 0, 0, 0); //执行Lua脚本

    luaContext->execute("test.lua");

 

printf("第二种方式:\n");

//luaL_dofile(L, "test.lua");

luaContext->dexecute("test.lua");

 

printf("call lua function lua_version\n");

lua_getglobal(L, "lua_version");

//lua_pushnumber(m_pState, nParam1);

//lua_pushnumber(m_pState, nParam2);

lua_pcall(L, 0, 0, 0);

 

printf("call lua function lua_onEvent\n");

lua_getglobal(L, "lua_onEvent");

lua_pushstring(L, "Click");

lua_pcall(L, 1, 0, 0);

 

FireEvent("DoubleClick");

FireEvent("Move");

 

    delete luaContext;

    return 0;

}

 

============================================

 

运行结果:

 

[INFO] 2014-04-10 23:54:37 lua runtime environment opened

Lua 5.1

Copyright (C) 1994-2008 Lua.org, PUC-Rio

R. Ierusalimschy, L. H. de Figueiredo & W. Celes

[DEBUG] 2014-04-10 23:54:37 LuaGlue function registerEvent registered

[DEBUG] 2014-04-10 23:54:37 LuaGlue function registerEventHandler registered

Type lua script from stdin terminal, and the script typed would be executed.

Usage:

        Type <Enter> to exit stdin

 

exit stdin terminal

this is lua output

第一种方式:

[INFO] 2014-04-10 23:54:38 Loaded lua file test.lua

hello, world

hello, world

[LUA] this is lua runtime environment

register event handler lua_onEvent

[INFO] 2014-04-10 23:54:38 lua event handler lua_onEvent registered

 

[INFO] 2014-04-10 23:54:38 Executed lua file test.lua

第二种方式:

hello, world

hello, world

[LUA] this is lua runtime environment

register event handler lua_onEvent

[INFO] 2014-04-10 23:54:38 lua event handler lua_onEvent registered

 

[INFO] 2014-04-10 23:54:38 Executed lua file test.lua directly

call lua function lua_version

[LUA] this is lua runtime environment

call lua function lua_onEvent

on event        Click

Click

on event        DoubleClick

DoubleClick

on event        Move

Move

[INFO] 2014-04-10 23:54:38 lua runtime environment close

 

 

C/C++中嵌入LUA脚本(C/C++与LUA相互交互调用)-2

 

/*

 *

 *

 * @author ada

 * @version 1.0

 * @since 1.0

 */

#include <log.h>

#include "../LuaRuntime.hpp"

#include "../Task.hpp"

#include "../../LinkedLibrary.h"

 

LuaRuntime *runtime = NULL;

 

int lua_create_task(struct lua_State *L)

{

LuaContext &context = runtime->getContext();

int taskId = context.getIntArgument(1);

const char *taskName = context.getStringArgument(2);

int preTaskId = context.getIntArgument(3);

int postTaskId = context.getIntArgument(4);

const char *awards = context.getStringArgument(5);

info("create task id: %d, name: %s, pre-task-id: %d, post-task-id: %d, awards: %s", taskId, taskName, preTaskId, postTaskId, awards);

 

Task task;

task.createGlobalTask(taskId, taskName, preTaskId, postTaskId, awards);

return 0;

}

 

int lua_create_instance(struct lua_State *L)

{

return 0;

}

 

int lua_create_character(struct lua_State *L)

{

return 0;

}

 

int lua_create_object(struct lua_State *L)

{

return 0;

}

 

void init_task()

{

Task task;

task.clearGlobal();

runtime->dexecute("Task.data.lua");

}

 

int lua_runtime_version()

{

puts(LUA_VERSION);

puts(LUA_COPYRIGHT);

puts(LUA_AUTHORS);

return 0;

}

 

void init()

{

///*

runtime = LuaRuntime::instance();

lua_runtime_version();

runtime->registerFunction("lua_create_task", lua_create_task);

runtime->registerFunction("lua_create_instance", lua_create_instance);

runtime->registerFunction("lua_create_character", lua_create_character);

runtime->registerFunction("lua_create_object", lua_create_object);

//*/

 

init_task();

}

 

int main(int argc, char **args) 

{

init();

    return 0;

}

 

=============================================

 

#if ! defined __TASK

#define __TASK

class Task

{

private:

 

public:

void clearGlobal();

 

void createGlobalTask(int taskId, const char *taskName, int preTaskId, int postTaskId, const char *awards);

};

#endif

 

========================================

 

/*

 *

 *

 * @author ada

 * @version 1.0

 * @since 1.0

 */

#include <log.h>

#include <string>

 

#include "Task.hpp"

 

#include "../SQLException.hpp"

#include "../Mysql.hpp"

#include "../Connection.hpp"

#include "../Statement.h"

#include "../ResultSet.hpp"

 

void Task::clearGlobal()

{

Mysql *mysql = new Mysql("localhost", 3306, "liveim_test", "root", "jxcoco1128");

mysql->setEncode("gbk");

Connection *connection = NULL;

try 

{

connection = mysql->openConnection();

 

Statement *stat = connection->createStatement();

 

stat->execute("delete from global_task");

}

catch (SQLException e) 

{

error("Connection error %d: %s", e.getCode(), e.getMessage());

return;

}

info("global task cleared");

}

 

 

void Task::createGlobalTask(int taskId, const char *taskName, int preTaskId, int postTaskId, const char *awards)

{

Mysql *mysql = new Mysql("localhost", 3306, "liveim_test", "root", "jxcoco1128");

mysql->setEncode("gbk");

Connection *connection = NULL;

try 

{

connection = mysql->openConnection();

 

Statement *stat = connection->createStatement();

 

std::string sql;

sql.append("insert into global_task values(");

char c_taskId[8];

itoa(taskId, c_taskId, 10);

sql.append(c_taskId).append(", ");

sql.append("'").append(taskName).append("', ");

memset(c_taskId, 0, sizeof(c_taskId));

itoa(preTaskId, c_taskId, 10);

sql.append(c_taskId).append(", ");

memset(c_taskId, 0, sizeof(c_taskId));

itoa(postTaskId, c_taskId, 10);

sql.append(c_taskId).append(", ");

sql.append("'").append(awards).append("')");

info("sql: %s", sql.c_str());

stat->execute(sql.c_str());

}

catch (SQLException e) 

{

error("Connection error %d: %s", e.getCode(), e.getMessage());

return;

}

 

 

/*

char *s1 = "insert into global_task values(";

int sz = strlen(s1) + strlen(instance_idx) + 1;

char *sql = (char *) malloc(sz);

memset(sql, 0, sz);

strcat(sql, s1);

strcat(sql, instance_idx);

 

printf("selecct global barrier: %s\n", sql);

stat->execute(sql);

free(sql);

*/

}

 

 

======================================

 

lua_create_task(1, "欢迎来到游戏世界!先去报个到!", 0, 2, "")

lua_create_task(2, "领取装备", 0, 0, "")

lua_create_task(3, "完成任务2", 0, 0, "")

 

======================================

 

DEBUG=../Debug

 

PATH_VS=D:\usr\bin\Microsoft Visual Studio\VC98

CL="$(PATH_VS)\Bin\cl.exe"

LINK="$(PATH_VS)\Bin\link.exe"

 

INCLUDE="D:\usr\bin\Microsoft Visual Studio\VC98\Include"

LIB="D:\usr\bin\Microsoft Visual Studio\VC98\Lib"

 

 

INCLUDE_LIB_LOG=D:\home\admin\workstation\c\liblog

LIB_LIB_LOG=D:\home\admin\workstation\c\liblog\Debug

 

INCLUDE_MYSQL=D:\usr\srv\mysql51\include

LIB_MYSQL=D:\usr\srv\mysql51\lib\debug

 

 

INCLUDE_LUA=D:\usr\bin\Lua\5.1\include

LIB_LUA=D:\usr\bin\Lua\5.1\lib

 

 

make: clean

$(CL) /GX /W3 /I $(INCLUDE) /c /Fo$(DEBUG)/ ../SQLException.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LIB_LOG) /I$(INCLUDE_MYSQL) /c /Fo$(DEBUG)/ ../Mysql.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LIB_LOG) /I$(INCLUDE_MYSQL) /c /Fo$(DEBUG)/ ../Connection.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LIB_LOG) /I$(INCLUDE_MYSQL) /c /Fo$(DEBUG)/ ../MysqlConnection.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LIB_LOG) /I$(INCLUDE_MYSQL) /c /Fo$(DEBUG)/ ../MysqlStatement.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LIB_LOG) /I$(INCLUDE_MYSQL) /c /Fo$(DEBUG)/ ../MysqlResultSet.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LIB_LOG) /I$(INCLUDE_MYSQL) /c /Fo$(DEBUG)/ ../Mysql.cpp

 

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LUA) /I$(INCLUDE_MYSQL) /I$(INCLUDE_LIB_LOG) /c /Fo$(DEBUG)/ ../gs/Task.cpp

 

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LUA) /I$(INCLUDE_LIB_LOG) /c /Fo$(DEBUG)/ ../gs/LuaException.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LUA) /I$(INCLUDE_LIB_LOG) /c /Fo$(DEBUG)/ ../gs/LuaContext.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LUA) /I$(INCLUDE_LIB_LOG) /c /Fo$(DEBUG)/ ../gs/LuaScriptExecutor.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LUA) /I$(INCLUDE_LIB_LOG) /c /Fo$(DEBUG)/ ../gs/LuaRuntime.cpp

$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LUA) /I$(INCLUDE_LIB_LOG) /c /Fo$(DEBUG)/ ../gs/data/DataBackendServer.cpp

 

 

#lib /nologo log.obj /out:./liblog.lib 

$(LINK) /LIBPATH:$(LIB) /LIBPATH:$(LIB_LIB_LOG) /LIBPATH:$(LIB_MYSQL) /LIBPATH:$(LIB_LUA) /OUT:$(DEBUG)/LuaRuntimeTest.exe $(DEBUG)/*.obj

#$(LINK) /DLL /LIBPATH:$(LIB) /OUT:$(DEBUG)/liblog.dll *.obj

#$(LINK) /DLL /LIBPATH:$(LIB) /OUT:$(DEBUG)/liblog.dll $(DEBUG)/*.obj

# $(LINK) *.obj /LIBPATH:"D:\usr\bin\Microsoft Visual Studio\VC98\Lib"

cp ../liblog.dll $(DEBUG)/

cp ./test.lua $(DEBUG)/

cp ../gs/Task.data.lua .

 

clean:

rm -Rf ./*.bak

rm -Rf ./*.o

rm -Rf ./*.obj

rm -Rf ./*.exe

rm -Rf ../Debug/*

 

0
1
分享到:
评论

相关推荐

    Lua和C/C++互相调用实例分析

    lua作为小巧精悍的脚本语言,易于嵌入c/c++中 , 广泛应用于游戏AI ,实际上在任何经常变化的逻辑上都可以使用lua实现,配合c/c++实现的底层接口服务,能够大大降低系统的维护成本。下面对lua和c/c++的交互调用做一...

    Lua与C/C++交互——C/C++调用Lua脚本

    Lua的C API提供了一系列函数,如`lua_push*()`和`lua_get*()`,用于在C/C++和Lua之间传递不同类型的数据,包括整数、浮点数、字符串、表等。 7. **回调机制** C/C++函数可以注册到Lua环境中,使得Lua脚本可以直接...

    C/C++执行lua脚本

    总结,"C/C++执行lua脚本"涉及的关键知识点包括:Lua语言的基本特性、Lua-5.2.3版本的更新、C++与Lua的交互机制、Lua的C API、数据交换、错误处理以及脚本的加载与执行。这些知识点对于开发人员来说,既是提升效率的...

    C/C++的Lua快速入门

    ### C/C++程序员Lua快速入门知识点详解 #### 数据类型 Lua的数据类型分为八种基本类型,这些类型在很多方面与C/C++有所不同。 1. **数值(Number)**:内部以`double`形式存储,这使得Lua能处理浮点运算。尽管...

    Lua C/C++互相调用学习案例

    "Lua C/C++互相调用学习案例"的主题正聚焦于这一技术,特别是如何在C/C++项目中集成和使用Lua脚本语言。这个学习案例基于Visual Studio 2015开发环境,适合想要了解或提升这方面技能的开发者。 首先,Lua是一种轻量...

    lua调用C/C++函数

    在Lua中调用C或C++函数是通过Lua的C API来实现的,这使得我们可以利用C/C++的高性能特性,同时保留Lua的易读性和灵活性。下面我们将详细探讨如何在Lua-5.2.3版本中进行这样的调用。 首先,了解Lua的C API是关键。...

    C和C++程序员的Lua快速入门

    《C和C++程序员的Lua快速入门》是一本专为C和C++开发者设计的教程,旨在帮助他们迅速掌握Lua编程语言。Lua是一种轻量级的脚本语言,以其简洁的语法、高效的性能以及与C/C++的良好集成而受到欢迎。在C或C++项目中嵌入...

    linux环境中c++调用lua动态链接库以及编译方法

    2. 编译时链接`liblua.so`,可以使用`g++`命令行选项 `-llua` 或指定动态库路径:`-L/path/to/your/lua/library`。 3. 如果需要在运行时找到动态库,可能还需要设置`LD_LIBRARY_PATH`环境变量,或者在系统`/etc/ld....

    lua与c/c++之间的接口调用

    它与C/C++之间的接口调用允许开发者利用C/C++的高性能计算能力来弥补Lua在性能上的不足,同时也能够使用Lua来简化C/C++代码的开发。要实现Lua与C/C++之间的接口调用,我们需要了解Lua的基础语法,以及如何使用Lua的C...

    C++调用Lua配置.

    ### C++调用Lua配置详解 #### 一、概述 在软件开发中,有时需要将脚本语言与编译型语言结合使用以提高开发效率或灵活性。C++作为一种高效的编译型语言,常被用于系统级开发,而Lua作为轻量级且功能强大的脚本语言,...

    C和C++程序员的Lua快速入门.zip

    C/C++程序员可以编写C/C++模块,通过`luaL_loadbuffer()`或`luaL_loadfile()`加载后,使用`lua_setglobal()`将其注册到全局环境中。 学习Lua,C和C++程序员不仅可以提升动态脚本处理能力,还能更好地理解和利用两种...

    Lua的最基本使用 C++与lua的互相调用

    1. 注册C++函数:在C++中,你需要使用`lua_register`或`lua_CFunction`定义一个C++函数,使其能在Lua中调用。例如: ```cpp static int myCppFunction(lua_State *L) { // 获取参数并进行操作 int arg = lua_to...

    Lua程序开发

    - **C/C++接口(Lua C API)**:Lua通过一组C函数接口暴露给C/C++,允许在C/C++代码中调用Lua函数,反之亦然。 - **注册函数**:开发者可以通过luaL_register或lua_register函数将C/C++函数注册到Lua环境,使其...

    C++的lua访问封装

    C++函数需要转换成lua_CFunction类型,这个类型是一个C语言的函数指针,接受lua_State*作为唯一参数,该参数包含了Lua的状态信息,包括栈上的所有值。 3. **访问Lua函数**:在C++中调用Lua函数主要通过`lua_get...

    C/C++/C#/lua 静态代码检测工具tscancode

    腾讯开发的开源工具,非常简单好用。比pclint好用不止一个数量级。 我在2.14.24安装包的基础上,下载了最新代码(2022-04-08),编译出了exe和dll文件。 请先安装2.14.24的安装包,之后用最新的exe和dll文件覆盖到...

    C\C++中调用Lua函数的接口封装

    Lua C API 是一组C语言的函数,允许C/C++代码与Lua脚本进行交互。它提供了一系列的函数,如`luaL_newstate`用于创建一个新的Lua环境,`luaL_openlibs`打开默认的库,以及`luaL_loadbuffer`或`luaL_dofile`用于加载...

    超全的lua教程

    Lua是一种完全免费的脚本语言, 可以和C/C++语言紧密结合,它的官方网站在http://www.lua.org./ 在网站上可以下载到lua的源码, 没有可执行版本, 不过不用担心, 因为lua源码可以在任何一种C/C++的编译器上编译....

    lua_test.rar_C++_c# lua_c++ lua_lua_lua调用C++

    本示例中的"lua_test.rar"文件集是一个关于C++与Lua交互的实践案例,主要探讨了如何通过Lua脚本调用C++编写的函数。下面我们将详细探讨这个主题。 首先,Lua是一种轻量级的脚本语言,它简洁、易学,常被用于游戏...

    基于Lua语法API的轻量级跨平台C/C++构建工具设计源码

    该项目是一款轻量级跨平台C/C++构建工具,采用Lua语法API进行项目描述。源码总文件数为3417个,其中Lua脚本1990个,C/C++源文件合计555个(包括338个C文件、217个头文件、210个C++文件、52个MPP文件、50个M文件),...

    c++调用lua方式

    首先,C++调用Lua主要通过Lua的C API来实现,这个API提供了一系列的函数,允许C++代码加载、执行和交互Lua脚本。要开始这个过程,你需要包含Lua头文件`lua.h`并链接Lua库到你的C++项目中。 1. **初始化Lua环境**: ...

Global site tag (gtag.js) - Google Analytics