Windows UVC DShow IMoniker对象获取位置等属性的方法

(1)获取设备路径

通过IMoniker的BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag)方法可以获取IPropertyBag对象,然后通过IPropertyBag对象的Read(L"DevicePath", &varDevPath, NULL)方法获取设备路径。

void GetMonikerDeviceInfo(IMoniker *pM)
{
	HRESULT hr;
	IPropertyBag *pBag = 0;

	USES_CONVERSION;

	hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
	if(SUCCEEDED(hr))
	{
		VARIANT varDevPath;
		varDevPath.vt = VT_BSTR;
		hr = pBag->Read(L"DevicePath", &varDevPath, NULL);
		{
			if(SUCCEEDED(hr))
			{
				_tprintf(TEXT("DevicePath = %s\n"), W2T(varDevPath.bstrVal));
				GetDevPathInfo(W2T(varDevPath.bstrVal));
				SysFreeString(varDevPath.bstrVal); 
			}
		}

		SAFE_RELEASE(pBag);
	}
}

(2)通过设备路径获取设备属性

通过SetupDiOpenDeviceInterface函数打开设备路径,在通过SetupDiGetDeviceInterfaceDetail函数获取SP_DEVINFO_DATA结构的值,有了这个结构的值就可以调用SetupDiGetDeviceRegistryProperty函数获取设备的一系列属性值了。

void GetDevPathInfo(LPCTSTR szIntfPath)
{
	HDEVINFO hDevInfo = SetupDiCreateDeviceInfoList(NULL, NULL);
	if (INVALID_HANDLE_VALUE == hDevInfo)
	{
		return;
	}


	BYTE Buf[1024] = {0};
	TCHAR szTemp[MAX_PATH] = {0};

	SP_DEVICE_INTERFACE_DATA spdid = {0};
	spdid.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);


	PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;
	pspdidd->cbSize = sizeof(*pspdidd); 

	SP_DEVINFO_DATA spdd = {0};
	spdd.cbSize = sizeof(spdd);

	DWORD dwSize = 0;

	do 
	{

		if (!SetupDiOpenDeviceInterface(
			hDevInfo, 
			szIntfPath,
			0,
			&spdid))
		{
			break;
		}


		dwSize = sizeof(Buf);    
		if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd, dwSize, &dwSize, &spdd))
		{
			break;
		}

		//INFO(TEXT("DevicePath = %s\n"), pspdidd->DevicePath);
		if(SetupDiClassNameFromGuid(&spdd.ClassGuid, szTemp, MAX_PATH, &dwSize))
		{
			INFO(TEXT("Class = %s\n"), szTemp);
		}

		if (SetupDiGetClassDescription(&spdd.ClassGuid, szTemp, MAX_PATH, &dwSize))
		{
			INFO(TEXT("ClassDescription = %s\n"), szTemp);
		}


		if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spdd, SPDRP_DEVICEDESC, NULL, (PBYTE)szTemp, MAX_PATH - 1, NULL))         
		{
			INFO(TEXT("DeviceDesc = %s\n"), szTemp);
		}

		if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spdd, SPDRP_SERVICE, NULL, (PBYTE)szTemp, MAX_PATH - 1, NULL))         
		{
			INFO(TEXT("Service = %s\n"), szTemp);
		}

		if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spdd, SPDRP_LOCATION_PATHS, NULL, (PBYTE)szTemp, MAX_PATH - 1, NULL))         
		{
			INFO(TEXT("LocationPath = %s\n"), szTemp);
		}


		if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spdd, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szTemp, MAX_PATH - 1, NULL))         
		{
			INFO(TEXT("FriendlyName = %s\n"), szTemp);
		}

		GetLocationInfo(spdd.DevInst, szTemp, MAX_PATH);


		INFO(TEXT("\n"));
	}
	while (0);

	SetupDiDestroyDeviceInfoList(hDevInfo);

}

老夫电脑上输出如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值