Lua Wrapper类 - 通过DLL向Lua公开c ++静态方法

时间:2013-02-13 13:21:16

标签: c++ dll methods lua

我终于遇到了一个我无法在这里找到解决方案的问题。我正在使用此处http://lua-users.org/wiki/CppConvenientLuaWrapperClass中的Lua Wrapper类。我们已经能够公开一个完整的API以及更多其他功能,如串行通信等。

这个Lua Wrapper背后的概念是你在编译之前暴露每个方法,所以当你运行你的程序时,所有的方法都会被添加到Lua Stack中,这样你就可以执行它们了。现在的想法是构建一种Dll,以完成这种暴露方法的过程。这样您就不需要使用所有公开的方法发布版本,而是通过多个dll文件加载它们。

我尝试创建另一个表并在该表中注册其他方法,但是之后,之前公开的方法停止工作。

我能想到的另一种方法是创建一个dll,但在C中包含所有需要的方法并将其直接加载到Lua。但我认为另一种方式会更好。

你能做类似的事吗?我有一些错误的概念吗?

由于

嗯......嗯......我真的不想在这个时候改变我们的包装。我想我可以设法做到这一点。我没有为插件函数添加新表,而是添加了一个新的子表,其中包含要从Lua调用的函数名和cClosures。 所以最后我们应该:

application.functionName()
application.plugin.functionName()

即使它以这种方式工作也会很好。 现在我想知道在暴露要添加到应用程序[plugin] [pluginFunction]而不是aplication [pluginFunction]的函数时我们如何引用lua_settable? 这就是正常功能的暴露方式:

//mState is a pointer to a Lua_State
lua_pushstring( mState, functionName );

//methodDesc is a pointer to an object that describes the function arguments/returns 
lua_pushlightuserdata( mState, methodDesc );

//exposeMethodProxy is the method that is responsible for conneting lua c-calls to the c-functions
lua_pushcclosure( mState, exposedMethodProxy, 1 );

//mMethodTableIndex is a member variable that contains the index of the table tha hold all exposed functions
lua_settable( mState, mMethodTableIndex );

关于如何将主题表(在mMethodTableIndex)中添加cclosures作为mainTable [functionName]但在维护[plugin] [functionNane]中的任何想法。?

1 个答案:

答案 0 :(得分:1)

我不确定,你清楚你想做什么。扩展lua的典型方法是使用单个方法编写DLL,该方法使用Lua API来注册C ++类型和C函数。为了方便地绑定C ++函数和类,可以使用LuaBridge。这种绑定的一个例子是:https://github.com/d-led/xerceslua

xerceslua模块的DLL标头只包含一个函数:

#include <lua.hpp>
void register_xerceslua (lua_State* L);

实现内部LuaBridge用于绑定到C ++:

#include "xerceslua_lib.h"

#include <lua.hpp>
#include <LuaBridge.h>

void register_xerceslua (lua_State* L) {
...
luabridge::getGlobalNamespace(L)
    .beginNamespace("xerces")
    .addVariable("version",&version,false)
...
然后在Lua中,您可以访问公开的C ++ API:

assert(require 'xerceslua')

local parser=xerces.XercesDOMParser()
parser:loadGrammar("Employee.dtd",xerces.GrammarType.DTDGrammarType)

您可以将Lua用作嵌入式脚本语言,您可以在其中执行lua from within your software,或者可以将其用作可扩展脚本语言,使用上面显示的方法扩展它。两者都有效,但你必须考虑,你究竟想要做什么。