static tLuaCOMClassFactory* luacom_GetInprocFactory(REFCLSID rclsid) { BSTR clsid; try { CHK_COM_CODE(StringFromCLSID(rclsid, &clsid)); tStringBuffer luaclsid = tUtil::bstr2string(clsid); CoTaskMemFree(clsid); tLuaCOMClassFactory* pFactory = factoryCache_GetFactory(luaclsid); if(pFactory == NULL) { lua_State* L_inproc = luacom_DoRegistryFile(luaclsid); if(L_inproc != NULL) { pFactory = new tLuaCOMClassFactory(L_inproc); factoryCache_PutFactory(luaclsid,pFactory); } } return pFactory; } catch(class tLuaCOMException&) { return NULL; } }
int tLuaCOMEnumerator::callCOMmethod(lua_State* L, const char *name, int first_param, int num_params) { HRESULT hr = S_OK; // Next method if(strcmp(name, "Next") == 0) { VARIANT* pVar = NULL; unsigned long num_elements = 1, counter = 0; ULONG fetched = 0; if(num_params > 0) { num_elements = (unsigned long) lua_tonumber(L, first_param); } pVar = new VARIANT[num_elements]; for(counter = 0; counter < num_elements; counter++) VariantInit(&pVar[counter]); hr = pEV->Next(num_elements, pVar, &fetched); for(counter = 0; counter < fetched; counter++) { typehandler->com2lua(L, pVar[counter]); typehandler->releaseVariant(&pVar[counter]); } for(counter = 0; counter < num_elements; counter++) VariantClear(&pVar[counter]); delete[] pVar; pVar = NULL; return fetched; } if(strcmp(name, "Reset") == 0) { hr = pEV->Reset(); CHK_LCOM_ERR(hr == S_OK, "Unable to reset enumeration."); return 0; } if(strcmp(name, "Skip") == 0) { CHK_LCOM_ERR(num_params > 0, "Not enough parameters."); unsigned long num_elements = (unsigned long) lua_tonumber(L, first_param); hr = pEV->Skip(num_elements); luaCompat_pushBool(L, hr == S_OK); return 1; } if(strcmp(name, "Clone") == 0) { IEnumVARIANT* p_newEV = NULL; hr = pEV->Clone(&p_newEV); CHK_COM_CODE(hr); tLuaCOMEnumerator* enumerator = new tLuaCOMEnumerator(p_newEV); COM_RELEASE(p_newEV); enumerator->push(L); return 1; } return 0; }