zoukankan      html  css  js  c++  java
  • DirectShow控制台输出和保存视频设备名称

    #include "windows.h"  
    #include "TCHAR.h"  
    #include <dshow.h>
    #include <vector>
    #include <iostream>
    #include <cwctype>
    
    #define MAX_FRIENDLY_NAME_LENGTH    128  
    #define MAX_MONIKER_NAME_LENGTH     256
    
    typedef struct _TDeviceName
    {
    	WCHAR FriendlyName[MAX_FRIENDLY_NAME_LENGTH];   // 设备友好名  
    	WCHAR MonikerName[MAX_MONIKER_NAME_LENGTH];     // 设备Moniker名  
    } TDeviceName;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	TDeviceName name;
    	HRESULT hr;
    
    	// 初始化
    	std::vector<TDeviceName> vectorDevices;
    	vectorDevices.clear();
    
    	// 初始化COM  
    	hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    	if (FAILED(hr))
    	{
    		return hr;
    	}
    
    	// 创建系统设备枚举器实例  
    	ICreateDevEnum *pSysDevEnum = NULL;
    	hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysDevEnum);
    	if (FAILED(hr))
    	{
    		CoUninitialize();
    		return hr;
    	}
    
    	// 获取设备类枚举器  
    	IEnumMoniker *pEnumCat = NULL;
    	hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
    	if (hr == S_OK)
    	{
    		// 枚举设备名称  
    		IMoniker *pMoniker = NULL;
    		ULONG cFetched;
    		while (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
    		{
    			IPropertyBag *pPropBag;
    			hr = pMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void **)&pPropBag);
    			if (SUCCEEDED(hr))
    			{
    				// 获取设备友好名  
    				VARIANT varName;
    				VariantInit(&varName);
    				hr = pPropBag->Read(L"FriendlyName", &varName, NULL);
    				if (SUCCEEDED(hr))
    				{
    					StringCchCopy(name.FriendlyName, MAX_FRIENDLY_NAME_LENGTH, varName.bstrVal);
    					std::wcout << name.FriendlyName << std::endl;
    					// 获取设备Moniker名  
    					LPOLESTR pOleDisplayName = reinterpret_cast<LPOLESTR>(CoTaskMemAlloc(MAX_MONIKER_NAME_LENGTH * 2));
    					if (pOleDisplayName != NULL)
    					{
    						hr = pMoniker->GetDisplayName(NULL, NULL, &pOleDisplayName);
    						if (SUCCEEDED(hr))
    						{
    							StringCchCopy(name.MonikerName, MAX_MONIKER_NAME_LENGTH, pOleDisplayName);
    							vectorDevices.push_back(name);
    						}
    						CoTaskMemFree(pOleDisplayName);
    					}
    				}
    				VariantClear(&varName);
    				pPropBag->Release();
    			}
    			pMoniker->Release();
    		} // End for While  
    		pEnumCat->Release();
    	}
    	pSysDevEnum->Release();
    	CoUninitialize();
    }

  • 相关阅读:
    结队-贪吃蛇游戏-项目进度
    团队-象棋游戏-开发环境搭建过程
    团队-中国象棋游戏-设计文档
    结对-贪吃蛇游戏-开发环境搭建过程
    结对-结对编项目贪吃蛇-设计文档
    课后作业-阅读任务-阅读提问-1
    《20170911-构建之法:现代软件工程-阅读笔记》
    团队-中国象棋-成员简介及分工
    团队-团队编程项目中国象棋-需求分析
    结队-结队编程项目贪吃蛇--需求分析
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6751561.html
Copyright © 2011-2022 走看看