//--------------------------------------------------------------------------------
	CDeviceInterfaceList::CDeviceInterfaceList( CDeviceInterfaceClass& InterfaceClass, const mxTCHAR* szMachineName ) : m_Handle( 0 )
	,	m_pInterfaceClass( &InterfaceClass )
	,	m_szMachine( szMachineName )
	,	m_Library( CSetupAPI::Instance() )	
	{
		_WINQ_FCONTEXT( "CDeviceInterfaceList::CDeviceInterfaceList" );
		m_Handle = m_Library.SetupDiGetClassDevsEx( reinterpret_cast< const ::GUID* >( &( InterfaceClass.GUID() ) ), 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE, 0, m_szMachine );

		if( !m_Handle.IsNull() )
		{
			m_Handle.Attach( this );

			bool bEnumerated = false;
			unsigned long ulIndex = 0;
			do
			{	
				unsigned long ulError = 0;
				m_DevInterfaceData.cbSize = sizeof( ::SP_DEVICE_INTERFACE_DATA );
				if( m_Library.SetupDiEnumDeviceInterfaces( 
					reinterpret_cast< ::HDEVINFO >( m_Handle.Use() ), 0, 
					reinterpret_cast< const ::GUID* >( &( InterfaceClass.GUID() ) ), ulIndex, 
					reinterpret_cast< ::PSP_DEVICE_INTERFACE_DATA >( &m_DevInterfaceData ) ) )
				{
					unsigned long ulDeviceInterfaceDetailRequiredSize = 0;
					m_DevInterfaceDetailData.cbSize = sizeof( ::SP_DEVICE_INTERFACE_DETAIL_DATA );
					m_DevInfo.cbSize = sizeof( ::SP_DEVINFO_DATA );

					m_Library.SetupDiGetDeviceInterfaceDetail( reinterpret_cast< ::HDEVINFO >( m_Handle.Use() ),
						reinterpret_cast< ::PSP_DEVICE_INTERFACE_DATA >( &m_DevInterfaceData ),
						0, 0, &ulDeviceInterfaceDetailRequiredSize, 
						reinterpret_cast< ::PSP_DEVINFO_DATA >( &m_DevInfo ) );

					if( ulDeviceInterfaceDetailRequiredSize > 0 )
					{
						m_Library.SetupDiGetDeviceInterfaceDetail( reinterpret_cast< ::HDEVINFO >( m_Handle.Use() ),
							reinterpret_cast< ::PSP_DEVICE_INTERFACE_DATA >( &m_DevInterfaceData ),
							reinterpret_cast< ::PSP_DEVICE_INTERFACE_DETAIL_DATA >( &m_DevInterfaceDetailData ),
							ulDeviceInterfaceDetailRequiredSize, &ulDeviceInterfaceDetailRequiredSize, 
							reinterpret_cast< ::PSP_DEVINFO_DATA >( &m_DevInfo ) );
					}
					else
					{
						ulError = ::GetLastError();
					}
					
					CTString strDeviceInstance;
					unsigned long ulInstanceSize = 0;
					m_Library.SetupDiGetDeviceInstanceId( reinterpret_cast< ::HDEVINFO >( m_Handle.Use() ), reinterpret_cast< ::PSP_DEVINFO_DATA >( &m_DevInfo ), 0, 0, &ulInstanceSize );
					if( ulInstanceSize > 0 )
					{							
						m_Library.SetupDiGetDeviceInstanceId( m_Handle.Use(), reinterpret_cast< ::PSP_DEVINFO_DATA >( &m_DevInfo ), 
							strDeviceInstance.GetBufferSetLength( static_cast< unsigned short >( ulInstanceSize + 1 ) ), ulInstanceSize, &ulInstanceSize );
						strDeviceInstance.ValidateBuffer( static_cast< unsigned short >( ulInstanceSize ) );

					}
					else
					{
						ulError = ::GetLastError();
					}

					CTString strDeviceID;
					if( m_Library.CM_Get_Device_ID_Ex( static_cast< ::DEVINST >( m_DevInfo.DevInst ), strDeviceID.GetBufferSetLength( MaxDeviceIDLen + 1), MaxDeviceIDLen, 0, 0 ) != CR_SUCCESS )
					{
						ulError = ::GetLastError();
					}
					else
					{
						nsCodeQOR::CTLRef< CDeviceInstance > RefDevInst( 0 ); //TODO:= System().Devices(QOR_PP_SHARED_OBJECT_ACCESS).DeviceFromID( strDeviceInstance );
						
						//Create the CDeviveInterface
						CDeviceInterface* pDeviceInterface = m_pInterfaceClass->CreateObject();//new CDeviceInterface;

						pDeviceInterface->SetActive( m_DevInterfaceData.Flags & SPINT_ACTIVE );
						pDeviceInterface->SetDefault( m_DevInterfaceData.Flags & SPINT_DEFAULT ? true : false );
						pDeviceInterface->SetRemoved( m_DevInterfaceData.Flags & SPINT_REMOVED ? true : false );
						pDeviceInterface->SetPath( m_DevInterfaceDetailData.DevicePath );
						pDeviceInterface->SetClass( m_pInterfaceClass, ulIndex );
						pDeviceInterface->SetInstance( RefDevInst );		//Add the device to the Interface
						m_ArrayDeviceInterfaces.Append( pDeviceInterface );	//Add it to the Interface class
						if( !RefDevInst.IsNull() )							//Add it to the DeviceInstance
						{
							RefDevInst->Interfaces().Append( pDeviceInterface );
						}
					}

				}
				else
				{
					ulError = ::GetLastError();
					if( ulError == ERROR_NO_MORE_ITEMS )
					{
						bEnumerated = true;
					}
				}
				ulIndex++;
			}while( !bEnumerated );
		}
	}