시스템 디바이스 열거

IWiaDevMgr::EnumDeviceInfo(또는 IWiaDevMgr2::EnumDeviceInfo) 메서드를 사용하여 시스템에 설치된 WIA(Windows 이미지 획득) 디바이스를 열거합니다. 이 메서드는 디바이스의 속성에 대한 열거형 개체를 만들고 열거형 개체가 지원하는 IEnumWIA_DEV_INFO 인터페이스에 대한 포인터를 반환합니다.

그런 다음 , IEnumWIA_DEV_INFO 인터페이스의 메서드를 사용하여 시스템에 설치된 각 디바이스에 대한 IWiaPropertyStorage 인터페이스 포인터를 가져올 수 있습니다.

WiaSSamp 샘플 애플리케이션의 다음 코드는 시스템의 디바이스에 대한 열거형 개체를 만들고 해당 디바이스를 반복하는 방법을 보여 줍니다.

    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 이 매개 변수에 유효한 유일한 값을 나타내는 WIA 상수입니다.

이 예제에서 pWiaDevMgr 매개 변수는 CoCreateInstance에 대한 이전 호출 후 IWiaDevMgr(또는 IWiaDevMgr2) 인터페이스의 instance 가리킵니다.

애플리케이션은 pWiaEnumDevInfoIEnumWIA_DEV_INFO 인터페이스에 대한 포인터 주소로 채우는 IWiaDevMgr(또는 IWiaDevMgr2) 포인터 pWiaDevMgr의 IWiaDevMgr::EnumDeviceInfo(또는 IWiaDevMgr2::EnumDeviceInfo) 메서드를 호출합니다.

호출이 성공하면 애플리케이션은 IEnumWIA_DEV_INFO 포인터의IEnumWIA_DEV_INFO::Reset 메서드를 호출합니다. pWiaEnumDevInfo 변수는 열거형이 처음에 시작되도록 합니다.

이 호출이 성공하면 애플리케이션은 메서드가 더 이상 S_OK 반환하지 않을 때까지 IEnumWIA_DEV_INFO 포인터 pWiaEnumDevInfoIEnumWIA_DEV_INFO::Next 메서드를 반복적으로 호출하여 시스템의 디바이스를 반복하며 열거가 완료되었음을 나타냅니다.

pWiaEnumDevInfo-Next>에 대한 각 호출은 특정 디바이스에 대한 속성 정보를 포함하는 IWiaPropertyStorage 인터페이스에 대한 포인터로 pWiaPropertyStorage를 채웁니다.