HRESULT DensoControllerRC8::AddController()
{
  static const std::string CTRL_CONNECT_OPTION[BCAP_CTRL_CONNECT_ARGS] = 
    {"", "CaoProv.DENSO.VRC", "localhost", ""};

  HRESULT hr = E_FAIL;
  int srvs, argc;

  for(srvs = DensoBase::SRV_MIN; srvs <= DensoBase::SRV_MAX; srvs++) {
    std::stringstream ss;
    std::string strTmp;
    VARIANT_Ptr vntRet(new VARIANT());
    VARIANT_Vec vntArgs;

    VariantInit(vntRet.get());

    for(argc = 0; argc < BCAP_CTRL_CONNECT_ARGS; argc++) {
      VARIANT_Ptr vntTmp(new VARIANT());
      VariantInit(vntTmp.get());

      vntTmp->vt = VT_BSTR;

      if(argc == 0) {
        strTmp = "";
        if(m_name != "") {
          ss << ros::this_node::getNamespace() << m_name << srvs;
          strTmp = ss.str();
        }
      } else {
        strTmp = CTRL_CONNECT_OPTION[argc];
      }

      vntTmp->bstrVal = ConvertStringToBSTR(strTmp);

      vntArgs.push_back(*vntTmp.get());
    }

    hr = m_vecService[srvs]->ExecFunction(ID_CONTROLLER_CONNECT, vntArgs, vntRet);
    if(FAILED(hr)) break;

    m_vecHandle.push_back(vntRet->ulVal);
  }

  return hr;
}
void QueryNetworkAdapters(std::string query, std::vector<NetworkAdapter*> &vAdapters)
{

	std::cout << "1: " << &vAdapters << std::endl;

	HRESULT hRes;
 //   // Step 1: --------------------------------------------------
 //   // Initialize COM. ------------------------------------------
 //   hRes = CoInitializeEx(0, COINIT_MULTITHREADED); 
 //   if (FAILED(hRes))
 //   {
	//	std::cout << "Failed to initialize COM library. Error code = 0x" << std::hex << hRes << std::endl;
 //   }

 //   // Step 2: --------------------------------------------------
 //   // Set general COM security levels --------------------------
 //   // Note: If you are using Windows 2000, you need to specify -
 //   // the default authentication credentials for a user by using
 //   // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
 //   // parameter of CoInitializeSecurity ------------------------
 //   hRes = CoInitializeSecurity(
 //       NULL, 
 //       -1,                          // COM authentication
 //       NULL,                        // Authentication services
 //       NULL,                        // Reserved
 //       RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
 //       RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
 //       NULL,                        // Authentication info
 //       EOAC_NONE,                   // Additional capabilities 
 //       NULL                         // Reserved
 //       );	

	//if (FAILED(hRes))
	//{
	//	std::cout << "Failed to initialize security. Error code = 0x" << std::hex << hRes << std::endl;
	//	CoUninitialize();
	//}

	IWbemLocator* pIWbemLocator = NULL;
	IWbemServices* pWbemServices = NULL;
	BSTR bstrNamespace = (L"root\\cimv2");
	hRes = CoCreateInstance(
	  CLSID_WbemAdministrativeLocator,
	  NULL,
	  CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
	  IID_IUnknown,
	  (void **)&pIWbemLocator
	  );

	if (SUCCEEDED(hRes))
	{
	  hRes = pIWbemLocator->ConnectServer(
		  L"root\\cimv2", // Namespace
		  NULL, // Userid
		  NULL, // PW
		  NULL, // Locale
		  0, // flags
		  NULL, // Authority
		  NULL, // Context
		  &pWbemServices
	  );
	}

	// Format query
	query = "SELECT * FROM Win32_NetworkAdapter " + query;
	BSTR bsQuery = ConvertStringToBSTR(query.c_str());

	IEnumWbemClassObject* pEnumrator = NULL;
	hRes = pWbemServices->ExecQuery(L"WQL", bsQuery, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumrator);

	if (FAILED(hRes))
	{
		std::cout << "Failed pWbemServices->ExecQuery. Error code = 0x" << std::hex << hRes << std::endl;
		CoUninitialize();
	}

	IWbemClassObject* pClassObject[128] = {0};
	ULONG uReturned;
	hRes = pEnumrator->Reset();
	hRes = pEnumrator->Next(WBEM_INFINITE, 128, pClassObject, &uReturned);
	if (FAILED(hRes))
	{
		std::cout << "Failed pEnumObject->Next. Error code = 0x" << std::hex << hRes << std::endl;
		CoUninitialize();
	}	

	// Fill the vector
	for (int i = 0; i < uReturned; i++)
	{
		_variant_t guid;
		pClassObject[i]->Get(L"GUID", 0, &guid, NULL, NULL);

		//vNetworkAdapters.push_back(new NetworkAdapter(std::string(_com_util::ConvertBSTRToString(guid.bstrVal))));

		if (guid.vt == VT_BSTR)
		{
			//NetworkAdapter na(std::string(_com_util::ConvertBSTRToString(guid.bstrVal)));
			//vAdapters.push_back(new NetworkAdapter("{D15F65F4-27C5-4548-8705-B50B5B360737}"));
			char* chBuf = ConvertBSTRToString(guid.bstrVal);
			vAdapters.push_back(new NetworkAdapter(std::string(chBuf)));
			delete[] chBuf;
			//std::cout << _com_util::ConvertBSTRToString(guid.bstrVal) << std::endl;
		}

		pClassObject[i]->Release();
	}

	pEnumrator->Release();

	pIWbemLocator->Release();
	pWbemServices->Release();
}