시리얼 포트는 직렬 통신을 하기 위한 포트를 말한다. 포트 번호명은 COM번호 형식으로 되어 있다.
레지스트리  HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
에는 시스템에서 사용할 수 있는 시리얼 포트 목록이 저장되어 있다.

목록을 보면 가상 시리얼 포트도 포함되어 있다.
실제 존재하는 시리얼 포트 목록만 얻고 싶다면 WMI의 Win32_SerialPort 클래스를 사용하면 실존하는 시리얼 포트만 얻을 수 있다.

RegEnumValue를 사용하여 레지스트리에 시리얼 포트 저장된 키의 값을 읽어 시스템에 설정된 시리얼 포트를 나열한다.

위 이미지는 소스의 결과이다.
RegEnumValue는 오픈된 키에 값명과 값들을 인덱스 번호 0부터 시작하여, 지정된 항목의 값명과 값을 읽어온다.

오픈된 레지스트리 키에서 지정된 번호에 해당하는 값명과 값을 읽는다. 0부터 순차적으로 호출하여 ERROR_NO_MORE_ITEMS이 발생될까지 하면 해당 키의 전체 값명,값을 얻을 수 있다.

● 선언

Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long

● 인수

hKey ━ 오픈된 레지스트리키 핸들이나,정의된 레지스트리 특정키 상수
dwIndex ━ 읽을 키의 인덱스 번호 0이 첫번째
lpValueName ━ 키 이름을 저장할 버퍼
lpcbValueName ━ lpValueName 버퍼의 크기
lpReserved ━ 0
lpType ━ 키의 타입 저장될 변수
lpData ━ 키의 값을 받을 버퍼
lpcbData ━ lpData 버퍼의 크기

● 반환
성공 ━ ERROR_SUCCESS
실패 ━ 에러 코드

다음은 소스이다.
Option Explicit

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const ERROR_NO_MORE_ITEMS = 259
Private Const BUFFERSIZE = 255

Private Sub Form_Load()
    Dim OpenRegHwnd As Long ' 오픈된 레지스트리 키 핸들
    Dim ValueName As String ' 값명 버퍼
    Dim ValueNameSize As Long ' 값명 버퍼 사이즈, 및 버퍼에 저장된 값명 길이
    Dim Value As String ' 값 버퍼
    Dim ValueSize As Long ' 값 버퍼 사이즈, 및 버퍼에 저장된 값 길이
    Dim IndexCount As Long ' 값 인덱스 번호 카운터
   
    RegOpenKey HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM", OpenRegHwnd ' 레지스트리 키를 오픈한다
    ValueName = String(BUFFERSIZE, " ")
    Value = String(BUFFERSIZE, " ")
    IndexCount = 0
    ValueNameSize = BUFFERSIZE
    ValueSize = BUFFERSIZE
    While Not ERROR_NO_MORE_ITEMS = RegEnumValue(OpenRegHwnd, IndexCount, ValueName, ValueNameSize, 0&, ByVal 0&, ByVal Value, ValueSize)
        List1.AddItem Left(ValueName, ValueNameSize)
        List2.AddItem Left(Value, ValueSize)
        IndexCount = IndexCount + 1
        ValueNameSize = BUFFERSIZE
        ValueSize = BUFFERSIZE
    Wend
    RegCloseKey OpenRegHwnd ' 오픈된 레지스트리 키를 닫는다.
End Sub

+ Recent posts