C++得到系统活动、可用的串口及名称的两种方法

2021-04-14 14:32:47 浏览数 (1)

CreateFile方法:

void GetComList_256(CComboBox * CCombox)//获取可用com口支持到256个

{

CString strCom,strComOpen;

int nCom = 0;

int count = 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 );

count ;

}

CloseHandle(hCom);

} while(nCom<256);

CCombox->SetCurSel(0);

}

*******************************************************************

读取注册表方法:

int GetComList_Reg( CComboBox * CCombox )

{

HKEY hkey;

int result;

int i = 0;

CString strComName;//串口名称

CString strDrName;//串口详细名称

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;

strDrName = portName;

// 从右往左边开始查找第一个'\',获取左边字符串的长度

int len = strDrName.ReverseFind( '\');

// 获取'\'左边的字符串

CString strFilePath = strDrName.Left( len 1 );

// 获取'\'右边的字符串

CString fileName = strDrName.Right(strDrName.GetLength() - len-1);

fileName = strComName _T(": ") fileName;

CCombox->AddString(fileName);

i ;

} while ( 1 );

RegCloseKey( hkey );

}

CCombox->SetCurSel(0);

return i;

}

读取后还可以加入到组合框中,可以根据需要加入到数据中

0 人点赞