2013-02-13 3 views
1

У меня наконец-то возникла проблема, что я не могу найти решение здесь. Я использую Lua Wrapper Class, который находится здесь http://lua-users.org/wiki/CppConvenientLuaWrapperClass. Мы смогли выставить полный API плюс другие функции, такие как последовательная связь и дальше.Lua Wrapper Class - Предоставление статических методов C++ для Lua через DLL

Концепция этой Lua Wrapper заключается в том, что вы раскрываете каждый метод перед компиляцией, поэтому, когда вы запускаете свою программу, все методы будут добавлены в стек Lua и таким образом вы сможете их выполнить. Теперь идея состоит в том, чтобы создать вид Dll, чтобы завершить этот процесс разоблачения. Таким образом, вам не нужно будет выпускать версию со всеми открытыми методами, вместо этого вы загружаете их через несколько DLL-файлов.

Я попытался создать другую таблицу и зарегистрировать другие методы в этой таблице, но при этом предыдущие разоблаченные методы перестают работать.

Другой способ, о котором я могу думать, заключается в создании dll, но в C, который содержит все необходимые методы и загружает его непосредственно в Lua. Но я думаю, что было бы лучше.

Вы смогли сделать что-то подобное? Есть ли у меня неправильная концепция?

Благодаря

Humm ... Я действительно не хочу, чтобы изменить нашу обертку в это время. Думаю, мне удастся это сделать. Вместо добавления новой таблицы для функций плагина, я добавил новую подтаблицу, в которой будут указаны имена функций и cClosures для вызова из Lua. Таким образом, в конце концов, мы должны иметь:

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

Даже если она работает таким образом, что будет делать хорошо. Теперь интересно, как мы можем ссылаться на lua_settable при экспонировании функций, добавляемых в приложение [plugin] [pluginFunction] вместо приложения [pluginFunction] ?! Это как подвергаются нормальные функции:

//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 [плагин] [functionNane] .?

+0

wxLua делает то же самое - вы можете взглянуть на их код, чтобы посмотреть, как они это сделали. – finnw

+0

Humm спасибо, я посмотрю – MRodrigues

ответ

1

Я не уверен, вы ясно знаете, что хотите. Типичным способом расширения lua является запись DLL с помощью одного метода, который использует Lua API для регистрации типов C++ и функций C. Чтобы удобно связывать функции и классы C++, вы можете использовать LuaBridge. Примером такого связывания здесь: https://github.com/d-led/xerceslua

Заголовок для DLL модуля xerceslua содержит только одну функцию:

#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, или вы можете использовать его в качестве расширяемого языка сценариев, расширяя его, используя метод, показанный выше. Оба действительны, но вы должны учитывать, что именно вы пытаетесь сделать.

Смежные вопросы