WIA 2.0, C ++: IWiaDevMgr2 :: EnumDeviceInfo не обнаруживает подключенную камеру

Я пытаюсь написать программу, которая передает изображения и видео с камеры (для личного пользования на Win 8.1). Я использую пример кода Microsoft в качестве отправной точки (WIA Tutorial), и я наткнулся на стену, пытаясь обнаружить подключенные камеры. Проблема в том, что ошибок нет, и код, кажется, работает, но он просто не обнаруживает подключенную камеру (я пробовал с двумя разными камерами), в то время как камера четко определяется ОС (отображается в Windows Проводник).

Я что-то упускаю? IWiaDevMgr2 :: EnumDeviceInfo не способ обнаружения подключенных устройств? Вот код, который я использую:

HRESULT WiaCreateDeviceManager(IWiaDevMgr2 **ppWiaDevMgr)
{
    if(NULL == ppWiaDevMgr) return E_INVALIDARG;
    *ppWiaDevMgr = NULL;

    // Create an instance of the device manager
    HRESULT hr = CoCreateInstance(CLSID_WiaDevMgr2, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr2, (void**)ppWiaDevMgr);
    return hr;
}

HRESULT WiaEnumerateDevices(IWiaDevMgr2 *pWiaDevMgr)
{
    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);
    assert(hr == S_OK);

    if(SUCCEEDED(hr))
    {
        ULONG count(911);
        HRESULT res = pWiaEnumDevInfo->GetCount(&count);
        if(res == S_OK) printf("EnumDeviceInfo: count = %lu\n", count); // count is always zero
        else printf("IEnumWIA_DEV_INFO::GetCount() failed!\n");

        // 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*
                WiaReadProperties(pWiaPropertyStorage); // this line is never reached
                // 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 hr;
}

int main()
{
    ...
    IWiaDevMgr2 *wiamgr;
    WiaCreateDeviceManager(&wiamgr);
    HRESULT res = WiaEnumerateDevices(wiamgr); // res is always S_OK, but no device is detected
    ...
}

person greentea101    schedule 28.07.2015    source источник
comment
Что ж, ваши камеры просто не поддерживают WIA. Ничего необычного, они обычно имитируют дисковод, что упрощает копирование фотографий с камеры с помощью проводника. Все, что хотят делать большинство пользователей. Вам нужно будет перевести камеру в режим PTP, какой-то фон здесь. Superuser.com - лучшее место, чтобы задать вопросы по этому поводу.   -  person Hans Passant    schedule 28.07.2015
comment
Ганс, спасибо за ответ. Насколько я могу судить, камеры однозначно поддерживают WIA. Во-первых, они не отображаются в файловой системе, как вы предлагаете (мой файловый менеджер их не видит). Во-вторых, связанные с WIA команды PowerShell, о которых говорится в статье, о которой вы связались, работают нормально.   -  person greentea101    schedule 28.07.2015


Ответы (1)


Очевидно, WIA не поддерживает устройства с камерой в Windows Vista и более поздних версиях. Я только дважды видел это подразумеваемым или упоминаемым мимоходом в документации WIA, последний раз был на эту страницу. Я не могу поверить, что это происходит, после того, как я потратил так много времени на изучение WIA. Очевидно, я должен использовать WPD для камер, а не WIA.

Изменить: при этом я все еще не уверен, что происходит. Если я не могу программно использовать WIA в Win 8.1, то почему эти команды PowerShell работают?

$WIAdialog = New-Object -ComObject "WIA.CommonDialog"
$Device    = $WIAdialog.ShowSelectDevice()
$i=$WIAdialog.ShowAcquireImage()
$i.SaveFile("$pwd\test.$($i.fileExtension)")

Не работает ли только API для камер, а Scripting Model - нет?

person greentea101    schedule 28.07.2015