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

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

Я что-то пропустил? Является ли 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
...
}

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 работает?

1

Другие решения


По вопросам рекламы [email protected]