static lua_State* luacom_DoRegistryFile(const char* luaclsid) { lua_State* L_inproc = NULL; char* fileName; char* key = new char[strlen(luaclsid)+18]; strcpy(key, "CLSID\\"); strcat(key,luaclsid); strcat(key,"\\ScriptFile"); if(tCOMUtil::GetRegKeyValue(key,&fileName)) { L_inproc = luaL_newstate(); luaL_openlibs(L_inproc); #ifdef IUP /* iuplua initialization */ iuplua_open(L_inproc); iupkey_open(L_inproc); cdlua5_open(L_inproc); #ifndef NO_CPICONTROLS controlslua_open(L_inproc); gllua_open(L_inproc); #endif #ifdef SPEECH_SDK speechlua_open(L_inproc); #endif #ifdef USE_GLLUA gl_open(L_inproc); #endif iupluaim_open(L_inproc); #endif luacom_open(L_inproc); lua_pushvalue(L_inproc, LUA_REGISTRYINDEX); lua_pushstring(L_inproc,"inproc"); lua_pushboolean(L_inproc,TRUE); lua_settable(L_inproc,-3); lua_pop(L_inproc,1); if(!lua_dofile(L_inproc,fileName)) { lua_pushstring(L_inproc,"StartAutomation"); lua_gettable(L_inproc,-2); if(luaCompat_call(L_inproc, 0, 0)) { luacom_close(L_inproc); lua_close(L_inproc); L_inproc = NULL; } } else { luacom_close(L_inproc); lua_close(L_inproc); L_inproc = NULL; } } delete[] key; SAFEDELETEARR(fileName); return L_inproc; }
// lua C function that dispatches events // to sinks int tLuaCOMConnPoint::call_sinks(lua_State *L) { /// positions of parameters // self param (not used, but needed for ensuring // consistency const int self_param = 1; // first user param const int user_first_param = 2; // last user param, excluding upvalues const int user_last_param = luaCompat_getNumParams(L, 2); // upvalues const int connpoint = luaCompat_upvalueIndex(L, 1, 2); const int event = luaCompat_upvalueIndex(L, 2, 2); int num_params = 0; if(user_last_param < user_first_param) num_params = 0; else num_params = user_last_param - user_first_param + 1; // counter int i = 0; // gets connection point tLuaCOMConnPoint* cp = (tLuaCOMConnPoint*) luaCompat_getPointer(L, connpoint); // call each sink for(i = 0; i < (int)cp->cConnections; i++) { // pushes function LuaBeans::push(L, cp->sinks[i]); cp->sinks[i]->Lock(); lua_pushvalue(L, event); lua_gettable(L, -2); // removes table, leaving just function lua_remove(L, -2); // self param (mandatory but unused) LuaBeans::push(L, cp->sinks[i]); cp->sinks[i]->Lock(); // duplicates parameters (if any) for(i = user_first_param; i <= user_last_param; i++) { lua_pushvalue(L, i); } // calls function (including self param) // ignoring errors luaCompat_call(L, num_params+1, 0, NULL); // cleans stack lua_settop(L, user_last_param); } // events do not return nothing return 0; }
int luaCompat_call(lua_State* L, int nargs, int nresults) { tStringBuffer err; return luaCompat_call(L, nargs, nresults, err); }