이 블로그 검색

2019년 7월 23일 화요일

c/c++ Serial Port 목록 얻어오기

void getSerialPort()
{
//http://stackoverflow.com/questions/1388871/how-do-i-get-a-list-of-available-serial-ports-in-win32
//HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM 에  시리얼포트 번호들이 등록되어 있음.
//
//레지스터 읽어오면 됨. 코드는 아래 링크에서 가져옴
//http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=887656&ref=887655
HKEY hKey;

//https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms724895(v=vs.85).aspx
//오픈할 레지스터 키에 대한 기본키 이름
//오픈할 레지스터 서브키 이름
//레지스터키에 대한 핸들
RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), &hKey);

TCHAR szData[20], szName[100];
DWORD index = 0, dwSize = 100, dwSize2 = 20, dwType = REG_SZ;
m_Combo_CommList.ResetContent();
memset(szData, 0x00, sizeof(szData));
memset(szName, 0x00, sizeof(szName));


//https://msdn.microsoft.com/en-us/library/windows/desktop/ms724865(v=vs.85).aspx
//hKey - 레지스터키 핸들
//index - 값을 가져올 인덱스.. 다수의 값이 있을 경우 필요
//szName - 항목값이 저장될 배열
//dwSize - 배열의 크기
while (ERROR_SUCCESS == RegEnumValue(hKey, index, szName, &dwSize, NULL, NULL, NULL, NULL))
{
index++;

//https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspx
//szName-레지터스터 항목의 이름
//dwType-항목의 타입, 여기에서는 널로 끝나는 문자열
//szData-항목값이 저장될 배열
//dwSize2-배열의 크기
RegQueryValueEx(hKey, szName, NULL, &dwType, (LPBYTE)szData, &dwSize2);
m_Combo_CommList.AddString(CString(szData));

memset(szData, 0x00, sizeof(szData));
memset(szName, 0x00, sizeof(szName));
dwSize = 100;
dwSize2 = 20;
}

m_Combo_CommList.SetCurSel(0);
RegCloseKey(hKey);
}