2,643
社区成员
发帖
与我相关
我的任务
分享bool SerialEnum::query()
{
HKEY hKey = NULL;
// try to open target registry key
if (ERROR_SUCCESS != RegOpenKeyEx( HKEY_LOCAL_MACHINE,
TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),
0,
KEY_READ,
&hKey))
{
return false;
}
bool bResult = false;
TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name
DWORD cchClassName = MAX_PATH; // size of class string
DWORD cSubKeys=0; // number of subkeys
DWORD cbMaxSubKey; // longest subkey size
DWORD cchMaxClass; // longest class string
DWORD cValues; // number of values for key
DWORD cchMaxValue; // longest value name
DWORD cbMaxValueData; // longest value data
DWORD cbSecurityDescriptor; // size of security descriptor
FILETIME ftLastWriteTime; // last write time
DWORD DataType; //key data type
unsigned char KeyData[MAX_VALUE_DATA]; //key data buffer
DWORD DataSize = MAX_VALUE_DATA; //key data size
TCHAR achValue[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;
char tempstr[8];
LONG retCode = 0;
// Get the class name and the value count.
retCode = RegQueryInfoKey(
hKey, // key handle
achClass, // buffer for class name
&cchClassName, // size of class string
NULL, // reserved
&cSubKeys, // number of subkeys
&cbMaxSubKey, // longest subkey size
&cchMaxClass, // longest class string
&cValues, // number of values for this key
&cchMaxValue, // longest value name
&cbMaxValueData, // longest value data
&cbSecurityDescriptor, // security descriptor
&ftLastWriteTime); // last write time
if (retCode != ERROR_SUCCESS)
{
bResult = false;
goto _query_end;
}
// Enumerate the key values.
if (cValues == 0)
{
bResult = false;
goto _query_end;
}
for (int i=0; i<cValues; i++)
{
cchValue = MAX_VALUE_NAME;
achValue[0] = '\0';
DataType=0;
DataSize = MAX_VALUE_DATA;
KeyData[0]='\0';
retCode = RegEnumValue(
hKey, i,
achValue,
&cchValue,
NULL,
&DataType,
KeyData,
&DataSize);
if (retCode == ERROR_SUCCESS )
{
if (strstr(achValue,"USBSER") != NULL)
{
int k, j;
for (k=0,j=0; k<(int)DataSize; k++)
{
if ((KeyData[k]>'0' || KeyData[k]=='0') && (KeyData[k]<'9' || KeyData[k]=='9'))
{
tempstr[j] = KeyData[k];
j++;
}
}
tempstr[j]='\0';
m_arrItem[m_nCount] = atoi(tempstr);
m_nCount++;
}
}
}
bResult = (m_nCount > 0);
_query_end:
RegCloseKey(hKey);
return bResult;
}//可以通过遍历注册表项
//HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM\\
HKEY hKey;
int rtn;
m_cmbComm.ResetContent();
rtn = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm",
NULL, KEY_READ, &hKey);
if( rtn == ERROR_SUCCESS) // 打开串口注册表
{
int i=0;
char portName[256],commName[256];
DWORD dwLong,dwSize;
while(1)
{
dwSize = sizeof(portName);
dwLong = dwSize;
rtn = RegEnumValue( hKey, i, portName, &dwLong,
NULL, NULL, (PUCHAR)commName, &dwSize );
if( rtn == ERROR_NO_MORE_ITEMS ) // 枚举串口
break; // commName就是串口名字
i++;
}
RegCloseKey(hKey);
}