T
Hallo,
vielleicht könnt Ihr mir helfen:
Ich habe eine Klasse CLuaJobEvent die in der Funktion todo() eine Lua Instanz erstellt.
lua_State* L= luaL_newstate();
luabind::open(L);
luaL_openlibs(L); //Die Bibliothek
luabind::module(L) [
luabind::class_<CLuaJobEvent>("Job")
.def(luabind::constructor<>())
.def("operateMsg", &CLuaJobEvent::operateMsg)
.def("getMSG",&CLuaJobEvent::getMSG)
.def("exec",&CLuaJobEvent::executeExternProgramm)
.def("log",&CLuaJobEvent::log)
];
luabind::module(L) [
luabind::class_<VoucherStruct>("Voucher")
.def("id",&VoucherStruct::getID)
.def("param",&VoucherStruct::getparam)
.def("content",&VoucherStruct::getContent)
];
luabind::module(L) [
luabind::class_<CMSGObject>("MSG")
.def(luabind::constructor<>())
.def("getCmd",&CMSGObject::getCmd)
.def("getParam",&CMSGObject::getParamAsStdStr)
.def("getSRC",&CMSGObject::getSrcCon)
.def("copyto",&CMSGObject::copyTo)
.def("getSubDataName",&CMSGObject::getSubdataName)
.def("hasSubDataName",&CMSGObject::hasSubDataName)
.def("setNewTargetSet",&CMSGObject::setNewTragetStringSet)
.def("setCmd",&CMSGObject::setCmd)
.def("setParam",&CMSGObject::setParam)
];
int test=luaL_loadfile(L, m_LuaScriptPath.c_str() );
if(test)
{
logtxt << "Job " << m_MSGObj->getCmd() << " : " << m_LuaScriptPath.c_str() << " -- " << lua_tostring(L, -1) << std::endl;
m_SH.toLog(SL_ERROR,logtxt.str());
logtxt.str("");
lua_pop(L, 1);
return;
}
luabind::object compiledScript(luabind::from_stack(L, -1));
printf("Dat Funzt!\n");
try {
luabind::call_function<void>(compiledScript,this);
}catch(const exception &e) {
m_SH.toLog(SL_INFO,"\n###################################################################################\n");
logtxt << "Job " << m_MSGObj->getCmd() << ": Ausgefuehrtes Lua Script endet mit Fehler " << e.what() << ".\n";
m_SH.toLog(SL_ERROR,logtxt.str());
logtxt.str("");
}
Sie registriert über die funktion module(L) die 3 Klassen CLuaJobEvent ( also sich selbst), die Structur VoucherStruct und die Klasse CMSGObject.
Dann ladet sie das Script
local Job=...
local MSG=Job:getMSG()
Job:log("FTP-Operation.lua wird ausgefuehrt\n")
strmsg=MSG:getParam()
pos=string.find(strmsg,"SJ")
if pos ~= nil then
newmsg, subset=string.gsub(strmsg,"SJ","")
if subset >= 1 then
Job:log("Execute FTP-AutoClient.exe mit Option " .. newmsg .. " und Operationsdatei progress.j\n")
local v=Job:exec(MSG:getCmd(),"FTP-AutoClient.exe","C:\\tools\\Wente Thiedig GmbH\\FTP-AutoClient","-t " .. newmsg .. " -o progress.j")
if v ~= nil then
if v:content() == "0" then
Job:log("Execute FTP-AutoClient.exe erfolgreich ausgefuehrt\n")
local voucher2=Job:operateMsg("sendto",MSG:getCmd(),MSG:getParam(),"cognexcmd");
end
end
end
end
Job:log("FTP-Operation.lua Abgeschlossen\n")
Da das Script als Funktion auf den LuaStack gelegt wird, holt sie sich die Funktion und soll sie mit
luabind::call_function<void>(compiledScript,this);// (parameter this sich selbst ausführen)
die Funktion ausführen. nun bekomme ich aber eine Pointer Exception von get_pointee_class(lua_State* L, P const& p, class_id dynamic_id).
Weil die Klasse anscheinend nicht registriert wurde.
Hab ich Irgendetwas vergessen?
Mit freundlichen Grüssen
Twist