枚举电脑中的串口

我们一般对串口进行通信的时候,是自己指定的端口,但是个人感觉不是很方便,今天在网上找到了枚举串口的两种方法感觉很实用,不用自己去设备管理器查看串口了。

第一种方式 :通过注册表来枚举串口

void GetComList_Reg( CComboBox * CCombox )
{
    HKEY hkey;  
    int result;
    CString strComName;//串口名称
	int i=0;
    result = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
		_T( "Hardware\\DeviceMap\\SerialComm" ),
		NULL,
		KEY_READ,
		&hkey );
	
    if( ERROR_SUCCESS == result )   //   打开串口注册表   
    {   
        TCHAR portName[ 0x100 ], commName[ 0x100 ];

        DWORD dwLong, dwSize;
		
		CCombox->ResetContent();
        do
        {   
            dwSize = sizeof( portName ) / sizeof( TCHAR );
            dwLong = dwSize;
            result = RegEnumValue( hkey, i, portName, &dwLong, NULL, NULL, ( LPBYTE )commName, &dwSize );
            if( ERROR_NO_MORE_ITEMS == result )
            {
                //   枚举串口
                break;   //   commName就是串口名字"COM2"
            }		
	   strComName=commName;		
	  CCombox->AddString(strComName);
			i++;
			  
        } while ( 1 );
		
        RegCloseKey( hkey );   
    }
	
	CCombox->SetCurSel(0);
}

功能描述

RegOpenKeyEx()      函数功能描述:打开一个指定的注册表键

原型

1
2
3
4
5
6
7
LONG  RegOpenKeyEx(
     HKEY  hKey,  // 需要打开的主键的名称
     LPCTSTR  lpSubKey,  //需要打开的子键的名称
     DWORD  ulOptions,  // 保留,设为0
     REGSAM samDesired,  // 安全访问标记,也就是权限
     PHKEY  phkResult  // 得到的将要打开键的句柄
RegEnumValue( )枚举指定项的值
hKey Long,一个已打开项的句柄,或者指定一个标准项名
dwIndex Long,欲获取值的索引。注意第一个值的索引编号为零
lpValueName String,用于装载位于指定索引处值名的一个缓冲区
lpcbValueName Long,用于装载lpValueName缓冲区长度的一个 变量。一旦返回,它会设为实际载入缓冲区的字符数量
lpReserved Long,未用;设为零
lpType Long,用于装载值的类型代码的 变量
lpData Byte,用于装载值数据的一个缓冲区
lpcbData Long,用于装载lpData缓冲区长度的一个变量。一旦返回,它会设为实际载入缓冲区的字符数量


第二种方式为调用CreateFile方法;


void GetComList_256(CComboBox * CCombox)//获取可用com口支持到256个
{
	CString  strCom,strComOpen;  
	int  nCom  =  0;   
	HANDLE    hCom;
	
	CCombox->ResetContent();
	do  
	{  
		nCom++;  
		strCom.Format("COM%d",  nCom);
		strComOpen.Format("\\\\.\\COM%d",  nCom);
		hCom  =  CreateFile(strComOpen,  GENERIC_READ | GENERIC_WRITE,  0,  NULL,    
			OPEN_EXISTING,  FILE_FLAG_OVERLAPPED,  0);  
		if(INVALID_HANDLE_VALUE  ==  hCom  )  
		{ 
			DWORD error=::GetLastError();//取得错误信息 
		} 
		else
		{
			CCombox->AddString( strCom );
		}  
		CloseHandle(hCom);
	}  while(nCom<256);
	
	CCombox->SetCurSel(0);
}
CreateFile()这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。

说明编辑

1
2
3
4
5
6
7
8
9
HANDLE  WINAPI CreateFile(
_In_  LPCTSTR  lpFileName,
_In_  DWORD  dwDesiredAccess,
_In_  DWORD  dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_  DWORD  dwCreationDisposition,
_In_  DWORD  dwFlagsAndAttributes,
_In_opt_  HANDLE  hTemplateFile
);

Long,如执行成功,则返回 文件句柄。INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS
参数类型及说明
函数声明HANDLE CreateFile(LPCTSTR lpFileName, //普通文件名或者设备文件名 DWORD dwDesiredAccess, //访问模式(写/读)DWORD dwShareMode, //共享模式LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针DWORD dwCreationDisposition, //如何创建DWORD dwFlagsAndAttributes, //文件属性HANDLE hTemplateFile //用于复制文件句柄);参数说明
lpFileName String要打开的文件的名或设备名。这个字符串的最大长度在ANSI版本中为MAX_PATH,在unicode版本中为32767。
dwDesiredAccess指定类型的访问对象。如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息 。
另外,还可以指定下面的控制标志:
标准控制权限(16-23位掩码):
DELETE 删除对象的权限。
READ_CONTROL 从对象的安全描述符中读取信息的权限,但不包括SACL(系统访问控制列表)中的信息。
WRITE_DAC 修改对象安全描述符中的DACL(随机访问控制列表)的权限
WRITE_OWNER 修改对象安全描述符中的属主的权限
SYNCHRONIZE 同步化使用对象的权限,即可以创建一个线程等待信号量释放(但有些对象不支持这个权限)。
STANDARD_RIGHTS_REQUIRED 等价于前面四种权限的总合(通常这四种是必须具有的权限)。
STANDARD_RIGHTS_READ 一般等价于READ_CONTROL
STANDARD_RIGHTS_WRITE 一般等价于READ_CONTROL
STANDARD_RIGHTS_EXECUTE 一般等价于READ_CONTROL
STANDARD_RIGHTS_ALL 等价于前面五种权限的总合。
特殊控制权限(0-15位掩码):
SPECIFIC_RIGHTS_ALL
ACCESS_SYSTEM_SECURITY
MAXIMUM_ALLOWED
GENERIC_READ
GENERIC_WRITE
GENERIC_EXECUTE
GENERIC_ALL
注:实质上是通过ACCESS_MASK结构体的一个双字值来设置标准权限、特殊权限和一般权限的。
dwShareModeLong, 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示随后打开操作对象会成功只要删除访问请求;如果是FILE_SHARE_READ随后打开操作对象会成功只有请求读访问;如果是FILE_SHARE_WRITE 随后打开操作对象会成功只有请求写访问。
lpSecurityAttributesSECURITY_ATTRIBUTES, 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDispositionLong,下述常数之一:
CREATE_NEW 创建文件;如文件存在则会出错
CREATE_ALWAYS 创建文件,会改写前一个文件
OPEN_EXISTING 文件必须已经存在。由设备提出要求
OPEN_ALWAYS 如文件不存在则创建它
TRUNCATE_EXISTING 将现有文件缩短为零长度
dwFlagsAndAttributesLong, 一个或多个下述常数
FILE_ATTRIBUTE_ARCHIVE 标记归档属性
FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
FILE_ATTRIBUTE_NORMAL 默认属性
FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录
FILE_ATTRIBUTE_READONLY 文件为只读
FILE_ATTRIBUTE_SYSTEM 文件为系统文件
FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作
FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化
FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化
FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合 临时文件
也可在Windows NT下组合使用下述常数标记:
SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
hTemplateFile,hTemplateFile为一个文件或设备句柄,表示按这个参数给出的句柄为模板创建文件(就是将该句柄文件拷贝到 lpFileName指定的路径,然后再打开)。它将指定该文件的属性扩展到新创建的文件上面,这个参数可用于将某个新文件的属性设置成与现有文件一样,并且这样会忽略dwAttrsAndFlags。通常这个参数设置为NULL,为空表示不使用模板,一般为空。
返回值
如执行成功,则返回文件句柄。
INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS



你可能感兴趣的:(C/C++)