gpt4 book ai didi

c++ - WIA 2.0,C++:IWiaDevMgr2::EnumDeviceInfo 未检测到已连接的相机

转载 作者:行者123 更新时间:2023-11-30 05:40:21 30 4
gpt4 key购买 nike

我正在尝试编写一个从相机传输图像和视频的程序(供我个人使用,在 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
...
}

最佳答案

显然,WIA 不支持 Windows Vista 及更高版本的相机设备。我只在 WIA 文档中看到过两次暗示或提到这一点,最后一次是在 this page 上。 .在我花了这么多时间研究 WIA 之后,我不敢相信会发生这种情况。显然,我应该使用 WPD对于相机,而不是 WIA。

编辑:话虽如此,我仍然不确定发生了什么。如果我不能在 Win 8.1 上以编程方式使用 WIA,那么为什么这些 PowerShell 命令可以工作?

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

是不是只有 API 对相机不起作用,而脚本模型可以?

关于c++ - WIA 2.0,C++:IWiaDevMgr2::EnumDeviceInfo 未检测到已连接的相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31679277/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com