1

ここで解決策が見つからないという問題にようやく遭遇しました。ここhttp://lua-users.org/wiki/CppConvenientLuaWrapperClassにあるLuaラッパークラスを使用しています。完全な API に加えて、シリアル通信などのその他の機能を公開することができました。

この Lua ラッパーの背後にある概念は、コンパイルする前にすべてのメソッドを公開することです。そのため、プログラムを実行しているときに、すべてのメソッドが Lua スタックに追加され、その方法でそれらを実行できます。現在のアイデアは、メソッドを公開するこのプロセスを完了するために一種の Dll を構築することです。この方法では、公開されたすべてのメソッドを含むバージョンをリリースする必要はなく、複数の dll ファイルを介してメソッドをロードします。

別のテーブルを作成し、そのテーブルに他のメソッドを登録しようとしましたが、それにより、以前に公開されたメソッドが機能しなくなりました。

私が考えることができる他の方法は、必要なすべてのメソッドを含む dll を C で作成し、それを直接 Lua にロードすることです。しかし、私は他の方法が良いと思います。

同様のことができましたか?私は何か間違った概念を持っていますか?

ありがとう

うーん...現時点ではラッパーを変更したくありません。何とかやり遂げることができたと思います。プラグイン関数用の新しいテーブルを追加する代わりに、Lua から呼び出される関数名と cClosures を含む新しいサブテーブルを追加しました。したがって、最後に次のようになります。

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

このように動作しても、うまくいきます。aplication[pluginFunction] の代わりに application[plugin][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 );

cclosures をメイン テーブル (mMethodTableIndex) に mainTable[functionName] としてではなく、maintable[plugin][functionNane] に追加する方法についてのアイデアはありますか?

4

1 に答える 1

1

よくわかりませんが、あなたは自分が何をしたいのか明確です。lua を拡張する一般的な方法は、Lua API を使用して C++ 型と C 関数を登録する単一のメソッドを含む DLL を作成することです。C++ 関数とクラスを便利にバインドするには、LuaBridgeを使用できます。このようなバインディングの例は次のとおりです: https://github.com/d-led/xerceslua

xerceslua モジュールの DLL のヘッダーには、関数が 1 つだけ含まれています。

#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 を実行できます。また、上記の方法を使用して拡張可能な拡張可能なスクリプト言語として使用することもできます。どちらも有効ですが、正確に何をしようとしているのかを考慮する必要があります。

于 2013-02-13T15:45:19.090 に答える