第一个思路应该是用建立串口的方式来取得串口名,若建立失败,则此串口不存在
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() {
















第二个思路是获取注册表中记录的信息
// 串口信息都是保存在注册表的这个位置的 // HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPSERIALCOMM











































