STDMETHODIMP CMELCommand::put_PortName(BSTR newVal) { CAtlString strPortName(newVal); if (m_strPortName != strPortName) { Disconnect(); m_strPortName = strPortName; } return S_OK; }
void CEnumSerial::SearchPnpKeyW9x(HKEY hkPnp, BOOL bUsbDevice, CArray<SSerInfo,SSerInfo&> &asi) { // Enumerate the subkeys of the given PNP key, looking for values with // the name "PORTNAME" // First, open HKLM\Enum HKEY hkSubPnp = NULL; try { // Enumerate the subkeys of HKLM\Enum\*\PNP050[01] TCHAR acSubPnp[256]; DWORD dwSubPnpIndex = 0; DWORD dwSize = sizeof(acSubPnp)/sizeof(TCHAR); while (RegEnumKeyEx(hkPnp, dwSubPnpIndex++, acSubPnp, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { HKEY hkSubPnp = NULL; if (RegOpenKeyEx(hkPnp, acSubPnp, 0, KEY_READ, &hkSubPnp) != ERROR_SUCCESS) throw CString(_T("Could not read from HKLM\\Enum\\...\\")) + acSubPnp; // Look for the PORTNAME value char acValue[128]; dwSize = sizeof(acValue); if (RegQueryValueEx(hkSubPnp, _T("PORTNAME"), NULL, NULL, (BYTE*)acValue, &dwSize) == ERROR_SUCCESS) { CString strPortName(acValue); // Got the portname value. Look for a friendly name. CString strFriendlyName; dwSize = sizeof(acValue); if (RegQueryValueEx(hkSubPnp, _T("FRIENDLYNAME"), NULL, NULL, (BYTE*)acValue, &dwSize) == ERROR_SUCCESS) strFriendlyName = acValue; // Prepare an entry for the output array. SSerInfo si; si.strDevPath = CString(_T("\\\\.\\")) + strPortName; si.strPortName = strPortName; si.strFriendlyName = strFriendlyName; si.bUsbDevice = bUsbDevice; // Overwrite duplicates. BOOL bDup = FALSE; for (int ii=0; ii<asi.GetSize() && !bDup; ii++) { if (asi[ii].strPortName == strPortName) { bDup = TRUE; asi[ii] = si; } } if (!bDup) { // Add an entry to the array asi.Add(si); } } RegCloseKey(hkSubPnp); hkSubPnp = NULL; dwSize = sizeof(acSubPnp)/sizeof(TCHAR); // restore the buffer size } } catch (CString strError) { if (hkSubPnp != NULL) RegCloseKey(hkSubPnp); throw strError; } }