第一个思路应该是用建立串口的方式来取得串口名,若建立失败,则此串口不存在
void GetComList() {
CString strCom;
int nCom = 0 ;
int count = 0 ;
HANDLE hCom;
do {
nCom ++ ;
strCom.Format( " COM%d " , nCom);
hCom = CreateFile(strCom, 0 , 0 , 0 , OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
if (INVALID_HANDLE_VALUE == hCom)
break ;
m_cbComList.AddString(strCom);
CloseHandle(hCom);
} while ( 1 );
}
// -------------------------------------------------------------- -
第二个思路是获取注册表中记录的信息
// 串口信息都是保存在注册表的这个位置的 // HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPSERIALCOMM
HKEY hKey;
LONG ret;
OSVERSIONINFO osvi;
BOOL bOsVersionInfoEx;
char keyinfo[ 100 ],
comm_name[ 40 ],
ValueName[ 40 ];
int i;
DWORD sType,
Reserved,
cbData,
cbValueName;
hIcon = AfxGetApp() - > LoadIcon(IDI_HARDWARE);
SetIcon(hIcon, false );
ZeroMemory( & osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
memset(keyinfo, 0 , 100 );
strcpy(keyinfo, " HARDWARE/DEVICEMAP/SERIALCOMM " );
i = 0 ;
sType = REG_SZ;
Reserved = 0 ;
bOsVersionInfoEx = GetVersionEx( & osvi);
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyinfo, 0 , KEY_ALL_ACCESS, & hKey);
if (ret == ERROR_SUCCESS) {
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
for (i = 1 ; i <= 128 ; i ++ ) {
sprintf(comm_name, " COM%d " , i);
if (CommPortIsUsed(comm_name) == 1 )
m_comlist.AddString(comm_name);
}
} else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
do {
cbData = 40 ;
cbValueName = 40 ;
memset(comm_name, 0 , 40 );
memset(ValueName, 0 , 40 );
ret = RegEnumValue(hKey, i, ValueName, & cbValueName, NULL, & sType, (LPBYTE) comm_name, & cbData);
if (ret == ERROR_SUCCESS) {
if (CommPortIsUsed(comm_name) == 1 ) m_comlist.AddString(comm_name);
i ++ ;
}
} while (ret == ERROR_SUCCESS);
}
}
void GetComList() {
CString strCom;
int nCom = 0 ;
int count = 0 ;
HANDLE hCom;
do {
nCom ++ ;
strCom.Format( " COM%d " , nCom);
hCom = CreateFile(strCom, 0 , 0 , 0 , OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
if (INVALID_HANDLE_VALUE == hCom)
break ;
m_cbComList.AddString(strCom);
CloseHandle(hCom);
} while ( 1 );
}
// -------------------------------------------------------------- -
第二个思路是获取注册表中记录的信息
// 串口信息都是保存在注册表的这个位置的 // HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPSERIALCOMM
HKEY hKey;
LONG ret;
OSVERSIONINFO osvi;
BOOL bOsVersionInfoEx;
char keyinfo[ 100 ],
comm_name[ 40 ],
ValueName[ 40 ];
int i;
DWORD sType,
Reserved,
cbData,
cbValueName;
hIcon = AfxGetApp() - > LoadIcon(IDI_HARDWARE);
SetIcon(hIcon, false );
ZeroMemory( & osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
memset(keyinfo, 0 , 100 );
strcpy(keyinfo, " HARDWARE/DEVICEMAP/SERIALCOMM " );
i = 0 ;
sType = REG_SZ;
Reserved = 0 ;
bOsVersionInfoEx = GetVersionEx( & osvi);
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyinfo, 0 , KEY_ALL_ACCESS, & hKey);
if (ret == ERROR_SUCCESS) {
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
for (i = 1 ; i <= 128 ; i ++ ) {
sprintf(comm_name, " COM%d " , i);
if (CommPortIsUsed(comm_name) == 1 )
m_comlist.AddString(comm_name);
}
} else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
do {
cbData = 40 ;
cbValueName = 40 ;
memset(comm_name, 0 , 40 );
memset(ValueName, 0 , 40 );
ret = RegEnumValue(hKey, i, ValueName, & cbValueName, NULL, & sType, (LPBYTE) comm_name, & cbData);
if (ret == ERROR_SUCCESS) {
if (CommPortIsUsed(comm_name) == 1 ) m_comlist.AddString(comm_name);
i ++ ;
}
} while (ret == ERROR_SUCCESS);
}
}