U
So und nun noch den Versprochenen Code (falls es jemand mal brauchen kann).
CComPtr< IWbemLocator > locator;
hr = CoCreateInstance( CLSID_WbemAdministrativeLocator, NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, reinterpret_cast< void** >( &locator ) );
if ( FAILED( hr ) )
{
std::cerr << "Instantiation of IWbemLocator failed" << std::endl;
return -1;
}
CComPtr< IWbemLocator > locator;
// connect to local service with current credentials
CComPtr< IWbemServices > service;
hr = locator->ConnectServer( L"root\\cimv2", NULL, NULL, NULL,
WBEM_FLAG_CONNECT_USE_MAX_WAIT,
NULL, NULL, &service );
if ( SUCCEEDED( hr ) )
{
// execute a query
CComPtr< IEnumWbemClassObject > enumerator;
hr = service->ExecQuery( L"WQL", L"SELECT * FROM Win32_POTSModemToSerialPort",
WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator );
if ( SUCCEEDED( hr ) )
{
// read the first instance from the enumeration (only one on single processor machines)
IWbemClassObject *ModemToSerial = NULL;
ULONG retcnt;
// Get First ModemToSerialPort-Object
hr = enumerator->Next(WBEM_INFINITE, 1L, reinterpret_cast<IWbemClassObject**>( &ModemToSerial ), &retcnt );
// Enumerate the other Modems.
while((SUCCEEDED(hr)) && (retcnt > 0))
{
IWbemClassObject *Modem = NULL;
IWbemClassObject *SerialPort = NULL;
_variant_t varModemReference;
_variant_t varSerialPortReference;
std::wstring sModemName;
std::wstring sSerialPort;
// Get String to the Win32_POTSModem-Reference
hr = ModemToSerial->Get(L"Dependent", 0, &varModemReference, NULL, NULL );
if(SUCCEEDED (hr))
{
// Get Object of the String.
hr = service->GetObject(varModemReference.bstrVal, 0, NULL, &Modem, NULL);
if(SUCCEEDED (hr))
{
_variant_t varModem;
// Get the Name or the wanted Value of Win32_POTSModem.
hr = Modem->Get(L"Name", 0, &varModem, NULL, NULL );
if(SUCCEEDED (hr))
{
sModemName = varModem.bstrVal;
}
}
}
// Get String to the Win32_SerialPort-Reference
hr = ModemToSerial->Get(L"Antecedent", 0, &varSerialPortReference, NULL, NULL );
if(SUCCEEDED (hr))
{
// Get Object of the String.
hr = service->GetObject(varSerialPortReference.bstrVal, 0, NULL, &SerialPort, NULL);
if(SUCCEEDED (hr))
{
_variant_t varSerialPort;
// Get the Name or the wanted Value of Win32_POTSModem.
hr = SerialPort->Get(L"DeviceID", 0, &varSerialPort, NULL, NULL );
if(SUCCEEDED (hr))
{
sSerialPort = varSerialPort.bstrVal;
}
}
}
// Release Pointer
SAFE_RELEASE(ModemToSerial);
SAFE_RELEASE(SerialPort);
SAFE_RELEASE(Modem);
// Get Next ModemToSerialPort-Object
hr = enumerator->Next(WBEM_INFINITE, 1L, reinterpret_cast<IWbemClassObject**>( &ModemToSerial ), &retcnt );
}
}
}