|
发表于 2016-4-12 19:26:47
|
显示全部楼层
C#不知道,没玩过。给你贴一段偶14年用VC6写的程序,你参考一下好了:
int CPortSetupDlg::EnumSerial()
{
BOOL bFound = FALSE;
HDEVINFO DeviceInfoSet;
SP_DEVINFO_DATA DeviceInfoData;
_TCHAR buffer[MAX__DESC];
/* 获取串口驱动信息的集合 */
DeviceInfoSet = SetupDiGetClassDevs((LPGUID)&CLASS_GUID_COM_DEV,NULL,NULL,DIGCF_PRESENT);
if (INVALID_HANDLE_VALUE == DeviceInfoSet){
#ifdef CHINESE
MessageBox("无法获取串口类信息");
#endif
#ifdef ENGLISH
MessageBox("Can't get info for serial port class");
#endif
return -1;
}
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
/* 枚举设备 */
for(int i = 0; SetupDiEnumDeviceInfo(DeviceInfoSet,(DWORD)i,&DeviceInfoData); ++i){
BOOL bRet;
DWORD DataT;
DWORD dwBufferSize;
/* 获取设备信息 */
bRet = SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
MAX__DESC,
&dwBufferSize );
if (!bRet)
continue;
/* 匹配找到的设备 */
CString sDeviceDesc = buffer;
//if ((-1 == sDeviceDesc.Find(COM_DESC))&&(-1 == sDeviceDesc.Find(COM_DESC_NEW)))
// continue;
HKEY hKeyDev;
/* 打开注册表核对 */
hKeyDev = SetupDiOpenDevRegKey(DeviceInfoSet,&DeviceInfoData,
DICS_FLAG_GLOBAL,0,DIREG_DEV, KEY_READ);
if (INVALID_HANDLE_VALUE == hKeyDev){
(void)SetupDiDestroyDeviceInfoList(DeviceInfoSet);
#ifdef CHINESE
MessageBox("查到设备信息与注册表信息不匹配!");
#endif
#ifdef ENGLISH
MessageBox("Device info found does not match with registry!");
#endif
return -2;
}
memset(buffer, 0, MAX__DESC);
/* 读注册表中的portname键值 */
if(ERROR_SUCCESS != RegQueryValueEx(hKeyDev, _T("PortName"), NULL, NULL,
(unsigned char*)buffer, (LPDWORD)&dwBufferSize)){
(void)SetupDiDestroyDeviceInfoList(DeviceInfoSet);
#ifdef CHINESE
MessageBox("未在注册表中查到相关设备信息!");
#endif
#ifdef ENGLISH
MessageBox("Related device info was not found in registry!");
#endif
return -3;
}
sDeviceDesc = buffer;
if (-1 != sDeviceDesc.Find(_T("COM"))){
m_Ports_Avail_Control.AddString(sDeviceDesc);
//arrayComPort.Add(atol((char*)&buffer[3]));
bFound = TRUE;
}
}
(void)SetupDiDestroyDeviceInfoList(DeviceInfoSet);
//*
if(bFound)
{
return m_Ports_Avail_Control.GetCount();
}
return 0;
//*/
}
|
|