VC/MFC 怎么获取系统中已有的COM口

VC/MFC 如何获取系统中已有的COM口
小弟在做毕设,遇到点问题:
        手动的方式是在 "计算机管理 "-> "设备管理器 "- "端口 "查看系统已有的COM口.
我现在是想在程序里用代码去读取,有哪位高手知道吗?
       

------解决方案--------------------
搜索关键字 枚举串口
------解决方案--------------------
http://download.csdn.net/download/huangrongbin12/3568756
int CUtil::GetSystemPorts(CString *pNameList, CString *pPortList)
{
CRegKey RegKey;
int nCount = 0;

if(RegKey.Open(HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm") == ERROR_SUCCESS)
{
while(true)
{
char ValueName[_MAX_PATH];
unsigned char ValueData[_MAX_PATH];
DWORD nValueSize = _MAX_PATH;
DWORD nDataSize = _MAX_PATH;
DWORD nType;

if(::RegEnumValue(HKEY(RegKey), nCount, ValueName, &nValueSize, NULL, &nType, ValueData, &nDataSize) == ERROR_NO_MORE_ITEMS)
{
break;
}

if(pNameList)
pNameList[nCount] = ValueName;

if(pPortList)
pPortList[nCount] = ValueData;

nCount++;
}
}

return nCount;
}
------解决方案--------------------
void CSyst_Setting::CheckComPort()
{
HKEY hKey;
DWORD dwCount=0;//保存检索项的结果,即COM端口总数
DWORD dwBufLen=_MAX_PATH;//缓存大小


DWORD dwBufLen1[_MAX_PATH];//缓存大小
::FillMemory((LPVOID)dwBufLen1,_MAX_PATH*2,0xFF);
DWORD dwBufLen2[_MAX_PATH];//缓存大小
::FillMemory((LPVOID)dwBufLen2,_MAX_PATH*2,0xFF);



DWORD dwTp=REG_DWORD;//待检索项的数据类型


CString subKey=_T("SYSTEM\\CurrentControlSet\\Services\\serenum\\Enum");


if(ERROR_SUCCESS!=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subKey,
NULL,KEY_QUERY_VALUE,&hKey))
return;//打开注册表失败,退出程序


//注册表打开成功,进一步检索设备管理器的设备树显示的端口节点里COM口的个数
if(ERROR_SUCCESS!=::RegQueryValueEx(hKey, _T("Count"), NULL, &dwTp,
(LPBYTE)&dwCount, &dwBufLen))
{
::RegCloseKey( hKey );
return;//检索失败,退出
}

HKEY hKey1;
CString subKey1=_T("SYSTEM\\CurrentControlSet\\Enum\\");//的COM设备名字检索路径
CString strReg;
CString strACPI(_T('\0'),_MAX_PATH);
LPSTR lpstrACPI=strACPI.GetBuffer(_MAX_PATH);


CString strACPI1(_T('\0'),_MAX_PATH);
LPSTR lpstrACPI1=strACPI1.GetBuffer(_MAX_PATH);


for(unsigned int i=0;i<dwCount;i++)//COM端口数检索成功,进一步检索在设备管理器里出现的文字
{

strReg.Format("%d",i);


if(::RegQueryValueEx(hKey,(LPCSTR)strReg,NULL, 
&dwTp,(LPBYTE)lpstrACPI,&dwBufLen1[i])
!=ERROR_SUCCESS) 
break;//检索失败,退出


subKey1=subKey1+lpstrACPI;

if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subKey1,
NULL,KEY_QUERY_VALUE,&hKey1)!=ERROR_SUCCESS)
break;//打开注册表失败,退出程序


DWORD dwTp1=REG_SZ;//此处即为COM的说明文字项数据类型
if(ERROR_SUCCESS!=::RegQueryValueEx(hKey1, _T("FriendlyName"), NULL, &dwTp1,
(LPBYTE)lpstrACPI1, &dwBufLen2[i]))//检索COM口具体说明文字,即FriendlyName的值
break;//检索失败,退出

//-------------------------------
CString strNum;
// strNum =GetStr(lpstrACPI1);