| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3055 人关注过本帖
标题:vc 如何检测出本所有的COM口
只看楼主 加入收藏
a315010225
Rank: 2
等 级:论坛游民
帖 子:64
专家分:10
注 册:2009-10-29
结帖率:27.27%
收藏
已结贴  问题点数:20 回复次数:3 
vc 如何检测出本所有的COM口
急急急!
搜索更多相关主题的帖子: COM 检测 
2010-07-16 14:39
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:10 
简单方法:
CString strCom[255];
CString strTemp;

HANDLE hCom;
for(int i = 0;i<255;i++)
{
   strTemp.Format("\\\\.\\COM%d",i+1);
   hCom = CreateFile(strTemp, 0, 0, 0,
                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
   if(INVALID_HANDLE_VALUE == hCom )
                    continue;
   strCom[i] = strTemp;
   CloseHandle(hCom);   
}

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-16 18:30
mxs810
Rank: 9Rank: 9Rank: 9
来 自:火星
等 级:贵宾
威 望:16
帖 子:234
专家分:1122
注 册:2006-10-19
收藏
得分:10 
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;   
}  

授人以鱼不如授人以渔
2010-07-22 16:15
a315010225
Rank: 2
等 级:论坛游民
帖 子:64
专家分:10
注 册:2009-10-29
收藏
得分:0 
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);
        strNum.Format(_T( "%s "),   lpstrACPI1);
        int i;
        CString shuzi;
        
        for(i=0;i< strNum.GetLength();i++)
        {
            int unicode = (int)strNum.GetAt(i);
            if (unicode <= '9' && unicode >= '0')
            {
                shuzi += strNum.GetAt(i);
            }
            
        }
        shuzi="COM"+shuzi;
        m_intPort.AddString(shuzi);//添加检索的值添加到组合列表框
        m_intPort2.AddString(shuzi);//添加检索的值添加到组合列表框
        
        //---------------------------
        
        //    m_Com1.AddString(lpstrACPI1);//添加检索的值添加到组合列表框
        
        strReg.Empty();//重新对变量赋值,避免前后冲突
        subKey1.Empty();
        subKey1=_T("SYSTEM\\CurrentControlSet\\Enum\\");
        strACPI.Empty();
        strACPI1.Empty();
        strACPI=CString(_T('\0'),_MAX_PATH);
        strACPI1=CString(_T('\0'),_MAX_PATH);      
        
    }
   
   
    strACPI.ReleaseBuffer();
    strACPI1.ReleaseBuffer();
    ::RegCloseKey( hKey1 );
    ::RegCloseKey( hKey );
    m_intPort.SetCurSel(0);
    m_intPort2.SetCurSel(0);

}
2011-01-12 09:44
快速回复:vc 如何检测出本所有的COM口
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023962 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved