Aufzählen von Systemgeräten
Verwenden Sie die Methode IWiaDevMgr::EnumDeviceInfo (oder IWiaDevMgr2::EnumDeviceInfo),um die auf einem System installierten WIA-Geräte (Windows Image Acquisition) aufzählen. Diese Methode erstellt ein Enumerationsobjekt für die Eigenschaften der Geräte und gibt einen Zeiger auf die IEnumWIA _ DEV _ INFO-Schnittstelle zurück, die das Enumerationsobjekt unterstützt.
Sie können dann die Methoden der IEnumWIA _ DEV _ INFO-Schnittstelle verwenden, um einen IWiaPropertyStorage-Schnittstellenzeiger für jedes auf dem System installierte Gerät zu erhalten.
Der folgende Code aus der WiaSSamp-Beispielanwendung veranschaulicht, wie ein Enumerationsobjekt für die Geräte auf einem System erstellt und diese Geräte durch iteriert werden:
HRESULT EnumerateWiaDevices( IWiaDevMgr *pWiaDevMgr ) //XP or earlier
HRESULT EnumerateWiaDevices( IWiaDevMgr2 *pWiaDevMgr ) //Vista or later
{
//
// Validate arguments
//
if (NULL == pWiaDevMgr)
{
return E_INVALIDARG;
}
//
// Get a device enumerator interface
//
IEnumWIA_DEV_INFO *pWiaEnumDevInfo = NULL;
HRESULT hr = pWiaDevMgr->EnumDeviceInfo( WIA_DEVINFO_ENUM_LOCAL, &pWiaEnumDevInfo );
if (SUCCEEDED(hr))
{
//
// Loop until you get an error or pWiaEnumDevInfo->Next returns
// S_FALSE to signal the end of the list.
//
while (S_OK == hr)
{
//
// Get the next device's property storage interface pointer
//
IWiaPropertyStorage *pWiaPropertyStorage = NULL;
hr = pWiaEnumDevInfo->Next( 1, &pWiaPropertyStorage, NULL );
//
// pWiaEnumDevInfo->Next will return S_FALSE when the list is
// exhausted, so check for S_OK before using the returned
// value.
//
if (hr == S_OK)
{
//
// Do something with the device's IWiaPropertyStorage*
//
//
// Release the device's IWiaPropertyStorage*
//
pWiaPropertyStorage->Release();
pWiaPropertyStorage = NULL;
}
}
//
// If the result of the enumeration is S_FALSE (which
// is normal), change it to S_OK.
//
if (S_FALSE == hr)
{
hr = S_OK;
}
//
// Release the enumerator
//
pWiaEnumDevInfo->Release();
pWiaEnumDevInfo = NULL;
}
//
// Return the result of the enumeration
//
return hr;
}
WIA _ DEVINFO _ ENUM _ LOCAL ist eine WIA-Konstante, die den einzigen gültigen Wert für diesen Parameter darstellt.
Im Beispiel zeigt der Parameter pWiaDevMgr nach einem vorherigen Aufruf von CoCreateInstanceauf eine Instanz der IWiaDevMgr-Schnittstelle (oder IWiaDevMgr2).
Die Anwendung ruft die IWiaDevMgr::EnumDeviceInfo -Methode (oder IWiaDevMgr2::EnumDeviceInfo) der IWiaDevMgr-Methode (oder IWiaDevMgr2) des pWiaDevMgr-Zeigers auf, der pWiaEnumDevInfo mit der Adresse eines Zeigers auf die IEnumWIA _ DEV _ INFO-Schnittstelle füllt.
Wenn der Aufruf erfolgreich ist, ruft die Anwendung dann die IEnumWIA _ DEV _ INFO::Reset-Methode des IEnumWIA _ DEV _ INFO-Zeigers auf. Die Variable pWiaEnumDevInfo stellt sicher, dass die Enumeration am Anfang beginnt.
Wenn dieser Aufruf erfolgreich ist, durchgibt die Anwendung die Geräte im System, indem sie wiederholt die IEnumWIA _ DEV _ INFO::Next-Methode des IEnumWIA _ DEV _ INFO-Zeigers pWiaEnumDevInfo aufruft, bis die Methode nicht mehr S OK zurückgibt, was angibt, dass die Enumeration _ abgeschlossen ist.
Jeder Aufruf von pWiaEnumDevInfo->Next füllt pWiaPropertyStorage mit einem Zeiger auf die IWiaPropertyStorage-Schnittstelle, die Eigenschafteninformationen für ein bestimmtes Gerät enthält.