通过DirectShow Api获取系统麦克风、扬声器、摄像头信息
#include <windowsh>
#include <vector>
#include <dshowh>
#pragma comment(lib, "Strmiidslib")
#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;
//WCHAR 转换为 Char
char WCharToChar(WCHAR s)
{
int w_nlen = WideCharToMultiByte(CP_ACP, 0, s, -1, NULL, 0, NULL, false);
char ret = new char[w_nlen];
memset(ret, 0, w_nlen);
WideCharToMultiByte(CP_ACP, 0, s, -1, ret, w_nlen, NULL, false);
return ret;
}
//REFGUID guidValue : CLSID_AudioInputDeviceCategory(麦克风); CLSID_AudioRendererCategory(扬声器); //CLSID_VideoInputDeviceCategory(摄像头)
HRESULT GetAudioVideoInputDevices(std::vector<TDeviceName> &vectorDevices, REFGUID guidValue)
{
TDeviceName name;
HRESULT hr;
// 初始化
vectorDevicesclear();
// 初始化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(guidValue, &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(nameFriendlyName, MAX_FRIENDLY_NAME_LENGTH, varNamebstrVal);
// 获取设备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(nameMonikerName, MAX_MONIKER_NAME_LENGTH, pOleDisplayName);
vectorDevicespush_back(name);
}
CoTaskMemFree(pOleDisplayName);
}
}
VariantClear(&varName);
pPropBag->Release();
}
pMoniker->Release();
} // End for While
pEnumCat->Release();
}
pSysDevEnum->Release();
CoUninitialize();
return hr;
}
int _tmain(int argc, _TCHAR argv[])
{
std::vector<TDeviceName> vectorDevices;
vectorDevicesclear();
//获取摄像头信息
GetAudioVideoInputDevices(vectorDevices, CLSID_VideoInputDeviceCategory);
for (auto itor = vectorDevicesbegin(); itor != vectorDevicesend(); ++itor)
{
printf("FriendlyName = %s, MonikerName = %s\n", WCharToChar(itor->FriendlyName), WCharToChar(itor->MonikerName));
}
vectorDevicesclear();
//获取麦克风设备信息
GetAudioVideoInputDevices(vectorDevices, CLSID_AudioInputDeviceCategory);
for (auto itor = vectorDevicesbegin(); itor != vectorDevicesend(); ++itor)
{
//wprintf(L"FriendlyName = %ws, MonikerName = %ws\n", itor->FriendlyName, itor->MonikerName);
printf("FriendlyName = %s, MonikerName = %s\n", WCharToChar(itor->FriendlyName), WCharToChar(itor->MonikerName));
}
vectorDevicesclear();
//获取扬声器设备信息
GetAudioVideoInputDevices(vectorDevices, CLSID_AudioRendererCategory);
for (auto itor = vectorDevicesbegin(); itor != vectorDevicesend(); ++itor)
{
//wprintf(L"FriendlyName = %ws, MonikerName = %ws\n", itor->FriendlyName, itor->MonikerName);
printf("FriendlyName = %s, MonikerName = %s\n", WCharToChar(itor->FriendlyName), WCharToChar(itor->MonikerName));
}
getchar();
return 0;
}
TIA博途S7-1200学习笔记——数据类型 原创
2021-05-13 14:19:29
11点赞
驽马同学
码龄6年
关注
目录
一、 概述
二、 基本数据类型
1 二进制数
11 BOOL(位)
12 BYTE
13 WORD
14 DWORD
15 LWORD
2 整数
21 SINT
22 USINT
23 INT
24 UINT
25 DINT
26 UDINT
27 LINT
28 ULINT
3 浮点数
31 REAL
32 LREAL
4 字符串
41 字符
411 CHAR(字符)
412 WCHAR(宽字符)
42 字符串
421 STRING
三、复杂数据类型
1 Array(数组)
一、 概述
数据类型组的有效性
数据类型组中定义有数据的属性,例如:内容及有效存储区的表示。
在用户程序中,可使用预定义的数据类型,并将这些数据类型添加到用户自定义数据类型中。此时,可使用以下类别:
基本数据类型(二进制数、整数、浮点数、定时器、DATE、TOD、LTOD、CHAR、WCHAR)
复杂数据类型(DT、LDT、DTL、STRING、WSTRING、ARRAY、STRUCT)
用户自定义数据类型(PLC 数据类型 (UDT))
指针
参数类型
系统数据类型
硬件数据类型
数据类型 位数 字节数
Byte 8 1
Word 16 12
Dwod 32 4
Lwod 64 8
二、 基本数据类型
1 二进制数
11 BOOL(位)
长度: 1位
取值: FALSE 或 TRUE
输入值示例: FALSE、TRUE、BOOL#1、1、2#1、8#1、16#1、
12 BYTE
长度: 8位
取值: 0 ~ 255 或 -128 ~ +127
输入值示例: IB2、MB2、DB1DBB4
13 WORD
长度: 16位
取值: 0 ~ 65535 或 -32768 ~ +32767
输入值示例: MW10、DB1DBW2
14 DWORD
长度: 32位
取值: 0 ~ 4294967295 或 -2147483647 ~ +2147483647
输入值示例: MW10、DB1DBW2
15 LWORD
长度: 64位
取值: 略
输入值示例: 略
2 整数
21 SINT
长度: 8位
取值: -128 ~ +127
输入值示例: +55、SINT#+44
22 USINT
长度: 8位
取值: 0 ~ +255
输入值示例: 55、USINT#66
23 INT
长度: 16位
取值: -32768 ~ +32768
输入值示例: 555、INT#656
24 UINT
长度: 16位
取值: 0 ~ 65535
输入值示例: 6555、UINT#61156
25 DINT
长度: 32位
取值: -2147483648 ~ +3147483647
输入值示例: 126555、DINT#6111156
26 UDINT
长度: 32位
取值: 0 ~ +4294967295
输入值示例: 121216555、UDINT#61111156
27 LINT
长度: 64位
取值: 略
输入值示例: 略
28 ULINT
长度: 64位
取值: 略
输入值示例: 略
3 浮点数
31 REAL
长度: 32位 [31位:符号位;23-30位:指数位;0-22位:尾数位]
取值: 略
输入值示例: 略
处理 REAL 数据类型时会精确到 6 位数。
32 LREAL
长度: 64位 [63位:符号位;52-63位:指数位;0-51位:尾数位]
取值: 略
输入值示例: 略
处理 LREAL 数据类型时会精确到 15 位数。
4 字符串
41 字符
411 CHAR(字符)
长度: 8位
取值: ASCII 字符
输入值示例: ‘A’
412 WCHAR(宽字符)
长度: 16位
取值: ASCII 字符
输入值示例: WCHAR#‘A’
WCHAR 数据类型将扩展字符集中的单个字符保存为 UFT-16 编码形式。
42 字符串
421 STRING
长度:
取值: ASCII 字符串,包括特殊字符
输入值示例: “name”
三、复杂数据类型
1 Array(数组)
string
A type that describes a specialization of the template class basic_string with elements of type char as a string
wstring
A type that describes a specialization of the template class basic_string with elements of type wchar_t as a wstring
int main(){
wstring strTest ( L"中文" );
cout << "size:" << strTestsize() << endl; //输出 2
string strTest2 = "中文";
cout <<strTest2<< "size:" << strTest2size() << endl;//输出 4
return 0;
}
Returns the current number of elements in a string
size_type size( ) const;
std::stringsize() 返回 s 中字符的个数,不是字节数。返回值不包括最后的\0。
————————————————————
window如果使用微软C/C++编译器,则编译器默认打开开关/Zc:wchar_t,默认使用UTF-16编码,即所有Unicode字符都为2个字节,也就是上文中写了L的那种。
如果你改用UTF-8,那么值在0x0080到0x07FF之间的Unicode字符也会转换为2个字节。三个字节的是0X0800以上的Unicode字符。
如果你使用UTF-32,那么每个Unicode字符都是4个字节。
以上就是关于Directshow 获取 设备信息(麦克风,扬声器,摄像头)全部的内容,包括:Directshow 获取 设备信息(麦克风,扬声器,摄像头)、博途中hw开头的数据类型是什么、关于字符串编码,C++语言,计算“abc的”这个字符串的长度,Linux为6,Windows为5。如何让Windows长度也6等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)