Exemple #1
0
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;
}