Bill Sempf
2005년 12월
적용 대상:
.NET Framework 2.0
Visual Basic 2005
Visual Basic 6.0
요약: Bill Sempf가 Visual Basic 2005의 새로운 직렬 및 병렬 통신 기능을 소개하고 기존 Visual Basic 6.0 하드웨어 코드를 Visual Basic 2005로 마이그레이션하는 데 필요한 사항을 설명합니다(13페이지/인쇄 페이지 기준).
목차
향상된 장치 코딩 환경
모뎀 및 직렬 장치
프린터 및 병렬 장치
비디오 모니터 제어
IrDA 및 기타 네트워크 장치와 통신
결론
Visual Basic은 하드웨어 드라이버 제작에는 사용되지 않는 프로그래밍 언어지만 통신 포트 제어에는 자주 사용되고 있습니다. 직렬 및 병렬 통신은 프로그래밍 언어의 기능이 아니라 운영 체제의 기능이기 때문에 일반적으로 MsComm 또는 타사 구성 요소 등의 ActiveX 컨트롤을 통해 kernal32와 직접 통신하는 방식으로 이루어집니다.
이러한 응용 프로그램을 업그레이드하는 것은 그리 간단하지 않습니다. 하드웨어 통신을 위한 일반적인 전략은 Visual Basic 6.0과 동일하지만 Visual Basic 2005에서는 "무결성 보호"를 위해 응용 프로그램 이름이 바뀌었으며 작업에 필요한 클래스를 찾기도 어렵습니다.
이 기사에서는 장치 코딩에 대한 일반적인 해결 방법을 소개합니다. Visual Basic 2005에서 모뎀과 같은 직렬 장치, 프린터와 같은 병렬 장치, 비디오 모니터 및 적외선 포트와 통신하는 방법을 살펴보고, 플랫폼 간 변환을 통해 더 쉽게 관리할 수 있는 코드를 만드는 방법을 배웁니다.
향상된 장치 코딩 환경
Visual Basic 6에서 PC와 직접 통신하려면 프로그래머가 운영 체제를 제어하기 위한 코드를 작성해야 했습니다. 그러나 Visual Basic 2005에 사용되는 .NET Framework 2.0에는 기본 제공되는 하드웨어 제어 기능이 많습니다. 즉, 예전에는 Win32 호출을 만들어야 했던 작업을 관리 코드에서 수행할 수 있습니다.
Visual Basic은 하드웨어 제어에 잘 사용되지 않기 때문에 설명서나 MSDN Library에 관련 내용이 별로 없습니다. 그러나 이는 하드웨어 제어에 사용되는 클래스의 기능이 강력하지 않아서가 아니라, MSDN 기사가 주로 프로그래머를 대상으로 하고 대다수의 프로그래머가 Visual Basic을 사용하여 하드웨어를 제어하지 않기 때문입니다.
물론 Visual Basic 2005가 완벽한 하드웨어 언어는 아니지만 상당히 향상된 모델을 갖추고 있습니다. 이 기사를 통해 Visual Basic 2005에서 제공하는 기능과 제공하지 않는 기능을 살펴보도록 하겠습니다.
예를 들어 Visual Basic 2005에서는 직렬 포트 통신이 완벽하게 지원되므로 이제 직렬 포트 사용 시 Win32 라이브러리를 이용할 필요가 없습니다. 대신 SerialPort 클래스를 사용하여 필요한 작업을 대부분 수행할 수 있으며, 프린터 역시 제어할 수 있습니다. 또한 Visual Basic 2005에서는 비디오 드라이버 시스템도 제어할 수 있습니다. 다만 관리되지 않는 Interop 클래스를 사용하는 경우에만 보다 까다로운 하드웨어 제어가 필요합니다.
뿐만 아니라 My 개체에 PC 하드웨어를 제어하는 클래스가 많이 들어 있기 때문에 하드웨어 제어가 더욱 수월합니다. My.Computer를 사용하면 호스트 PC가 수행할 수 있는 작업의 대부분을 프로그래밍 방식으로 제어할 수 있습니다. 키보드, 마우스, 모니터, 모뎀 등의 하드웨어 기능이 IntelliSense를 통해 나타나므로 쉽게 사용할 수 있습니다.
모뎀 및 직렬 장치
Visual Basic 6에서는 MSComm 컨트롤이 직렬 포트 커넥터의 역할을 합니다. .NET에서도 Interop를 통해 MSComm 컨트롤을 사용할 수 있지만 라이센스 문제를 방지하려면 개발 시스템에 Visual Basic 6이 설치되어 있어야 합니다. pinvoke를 사용하여 kernel.dll과 직접 통신하는 방법도 있지만 그러면 너무 복잡해집니다. 물론 이와 관련된 예제도 MSDN에 있습니다.
대신 Visual Basic 2005의 System.IO.Ports.SerialPort 클래스를 사용하는 것이 좋습니다. 이 클래스는 기존 MSComm 개체와 매우 비슷하지만 관리 코드로서의 장점을 가지고 있습니다. 메서드는 다음과 같이 구성됩니다.
| 기존 MSComm 멤버 |
새로운 SerialPort 클래스 멤버 |
| OnComm 이벤트 |
DataReceived 이벤트 |
| CommPort 속성 |
PortName 속성 |
| Settings 속성 |
BaudRate, Parity, DataBits 및 StopBits 속성 |
| PortOpen 속성 |
IsOpen 속성 |
| Input 속성 |
Read 메서드 |
| Output 속성 |
Write 메서드 |
예제: 모뎀 연결
하드웨어 없이 하드웨어 코드를 작성하기는 쉽지 않습니다. 이와 관련하여 Microsoft 프로그램 관리자인 Noah Code는 USB-직렬 변환기 두 개를 사용하여 널 모뎀을 양쪽으로 연결해 시스템에서 직접 테스트하는 훌륭한 아이디어를 내놓았습니다. USB-직렬 변환기 (영문)를 PC에 연결하면 COM 포트 번호가 할당됩니다. 따라서 변환기를 두 개 연결하면 포트 번호도 두 개가 할당됩니다. 여기에 널 모뎀 (영문)을 연결하면 직렬 메시지를 완벽하게 송수신할 수 있습니다.
선택한 직렬 포트로 정보를 보내려면 새 SerialPort 개체를 열어야 합니다. 연결 설정에 필요한 모든 값은 SerialPort 클래스의 생성자(새 개체의 인스턴스를 만들면 실행되는 New 메서드)에 전달하면 됩니다. 적절한 속성을 사용하여 연결할 수도 있습니다. COM 포트 4에 연결된 56,000bps 장치를 예로 살펴보겠습니다. 이 경우 다음과 같이 생성자를 사용하여 컨트롤을 인스턴스화합니다.
Dim mySerialPort as SerialPort = new SerialPort("COM4", 56000, Parity.None, 8, StopBits.One)
새 개체에서 사용 가능한 속성이 늘어났기 때문에 우선 새 SerialPort를 만든 다음 나중에 속성을 설정할 수도 있습니다. 이때 기능상의 차이는 없지만 개체를 만드는 과정상의 차이점은 이해하는 것이 좋습니다.
Dim mySerialPort As SerialPort = New SerialPort()
With mySerialPort
.PortName = "COM4"
.BaudRate = 56000
.Parity = Parity.None
.DataBits = 8
.StopBits = StopBits.One
End With
Parity와 StopBits 열거자가 사용되었지만 이 두 열거자는 특별한 역할을 하지 않습니다. Parity.None은 0을 의미하는 상수일 뿐이며 가독성을 높이고 코드에서 매직 넘버를 방지하기 위한 것으로, 상당히 유용합니다. 이 코드는 앞에서 소개한 코드와 기능이 동일하며 MSComm 개체에 사용되는 난해한 연결 문자열에 비해 훨씬 이해하기 쉽습니다.
SerialPort 개체를 만들었으므로 MSComm 개체와 마찬가지로 정보를 송신하고 수신할 수 있습니다.
다음 예제에서 볼 수 있듯이 이 프로세스의 송신 부분은 MSComm 컨트롤의 Send 함수와 매우 비슷합니다.
Visual Basic 6
'이 코드에서는 폼에 myMsComm이라는 MSComm 컨트롤이 있다고 가정합니다.
myMsComm.Settings = "9600,N,8,1"
myMsComm.CommPort = 2
myMsComm.PortOpen = True
myMsComm.Output = "Hello World!"
myMsComm.PortOpen = False(참고: 프로그래머 코멘트는 샘플 프로그램 파일에는 영문으로 제공되며 기사에는 설명을 위해 번역문으로 제공됩니다.)
Visual Basic 2005
Dim mySerialPort As SerialPort = New SerialPort("COM4", 56000, Parity.None, 8, StopBits.One)
With mySerialPort
.Open()
.Write("Hello world!")
.Close()
End With
두 가지 코드가 거의 동일한 것은 우연의 일치가 아닙니다. Visual Basic .NET 2003에서 kernel.dll을 사용하여 직렬 포트를 통한 쓰기 작업을 하려면 80줄에 달하는 긴 코드를 작성해야 했습니다.
그렇다면 읽기 작업의 경우는 어떨까요? 읽기 작업의 효율은 Visual Basic 2005의 최대 장점 중 하나입니다. Visual Basic 6에서는 버퍼 크기를 처리하고 루프를 실행하고 기다리고 오류를 수정하는 번거로운 과정을 거쳐야 했습니다. 그리고 Visual Basic 6은 데이터를 스트림으로 처리하지 않기 때문에 직접 해결 방법을 찾아야 했습니다. 이러한 이유로 장치에 크게 종속되는 포트에서 데이터를 수신해야 하는 경우에는 다음과 같은 Visual Basic 6 코드를 작성해야 했습니다.
'MSDN에서 코드 발췌
Dim txtBuff As String
Dim i As Integer
Dim c As Long
Dim BuffLength
MSComm1.InBufferCount = 0 ' inBuffer 지우기
Do ' 수신 바이트 대기
DoEvents
Loop Until MSComm1.InBufferCount > 0
txtBuff = MSComm1.Input
BuffLength = Len(txtBuff) ' 수신 바이트 수
' (<= 4 bytes)
bstem = Asc(Mid(txtBuff, 1, 1)) ' 모듈 번호 구하기
bbuff(0) = Asc(Mid(txtBuff, 2, 1)) ' 패킷 크기 구하기
If BuffLength < 2 + bbuff(0) Then ' 수신 바이트가 패킷 크기보다 작은 경우
MSComm1.InBufferCount = 0 ' 다시 수행
Do
DoEvents
Loop Until MSComm1.InBufferCount > 0
txtBuff = txtBuff & MSComm1.Input
End If
For i = 3 To Len(txtBuff) ' 수신한 데이터를
c = Asc(Mid(txtBuff, i, 1)) ' bbuff() 배열에 씀
bbuff(i - 2) = c
Next
그러나 Visual Basic 2005에서는 SerialPort 개체의 DataReceived 이벤트에 대한 이벤트 처리기만 새로 만들면 됩니다. 다음 코드 샘플은 결과를 콘솔에만 출력하지만, 필요하면 데이터베이스나 문자열 배열에 저장하거나 Label 컨트롤을 통해 화면에 표시할 수도 있습니다.
Private Sub mySerialPort_DataReceived(ByVal sender As Object, _
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
Handles mySerialPort.DataReceived
Console.Write(mySerialPort.ReadExisting())
End Sub
어느 코드 블록이 더 효율적인지는 언급할 필요가 없을 것입니다. Visual Basic 2005는 .NET Framework를 통해 운영 체제 이벤트를 보다 효율적으로 처리하기 때문에 직렬 입력이 중단된 경우에도 유연하게 대처할 수 있지만 Visual Basic 6에서는 이러한 처리가 불가능합니다.
USB 장치의 경우
일부 USB 장치는 .NET Framework를 통해 별도로 처리됩니다. 예를 들어 플래시 드라이브는 System.IO.DriveInfo를 통해 처리되는 이동식 드라이브입니다.
하드웨어 드라이브 문제를 피할 수는 없지만 다음과 같은 일반적인 규칙을 기억해 두면 도움이 됩니다. 기본 Microsoft 드라이버를 사용하고 COM 포트가 있는 모든 장치는 SerialPort 클래스를 통해 통신할 수 있습니다. 예를 들어 RS232를 인식하지 못하는 USB 장치와 통신하려면 HID.dll 및 kernel.dll을 사용하여 Win32 API에 대한 pinvoke를 다시 실행해야 합니다. 자세한 내용은 OpenConnection(), GetExternalHubName() 및 GetNameOf() 메서드를 참조하십시오. Intel 웹 사이트 (영문)에도 이와 대한 자세한 내용이 있습니다.
유용한 팁
SerialPort 컨트롤에는 몇 가지 뛰어난 장점이 있습니다. 컨트롤의 이름만 보아도 알 수 있듯이 이 컨트롤은 MSComm 컨트롤보다 일반화되어 있기 때문에 다양한 장치로부터 수신된 입력을 문제 없이 처리할 수 있습니다. 물론 이러한 기능은 이 클래스의 몇 가지 멤버 덕분에 가능합니다.
- 장치에서 송수신되는 정보의 스트림이 있는 기반 개체를 얻으려면 BaseStream 속성을 사용합니다. 코드에서 원시 데이터를 처리하기 전에 수정할 수 있습니다.
- 같은 코드 줄에서 스트림의 전송 전 인코딩과 전송 후 인코딩을 결정하는 인코딩 옵션을 설정할 수 있습니다.
- MSComm 컨트롤에는 Input 속성밖에 없지만 SerialPort 클래스에는 Read, ReadByte, ReadChar, ReadExisting, ReadLine 및 ReadTo의 6가지 읽기 메서드가 있습니다.
- SerialPort 클래스는 IContainer 인터페이스를 구현합니다.
- ErrorReceived 이벤트와 PinChanged 이벤트에 액세스할 수 있습니다. 이 이벤트를 사용하여 보다 안정적으로 하드웨어 컨트롤러를 사용할 수 있습니다.
프린터 및 병렬 장치
Visual Basic 6에서 인쇄 작업을 하는 데는 Printers 컬렉션을 사용하는 방법과 winspool.drv를 통해 Win32 API를 호출하는 두 가지 방법이 있습니다. 두 가지 방법 모두 성능과 유연성이 뛰어나지만 엄청난 양의 코드가 필요하다는 단점이 있습니다.
winspool.drv API의 멤버로는 OpenPrinter, StartDocPrinter, StartPagePrinter, WritePrinter, EndPagePrinter, EndDocPrinter, ClosePrinter 등이 있습니다. 다른 API 호출과 마찬가지로 제공되는 기능은 많지만 구성상의 문제가 있습니다. 즉, 원하는 프린터를 찾을 수 없고 winspool 드라이버를 사용하는 구성 요소에서 기본 프린터를 사용하는 경우가 많기 때문에 PC의 유연성이 크게 저하됩니다.
Printers 컬렉션과 Printer 개체를 사용하는 경우에는 성능이 약간 떨어지지만 유연성은 다소 향상됩니다. 대개 프로그램은 컬렉션을 반복하여 필요한 조건(예: 컬렉션에 있는 프린터 중 8x14 용지를 지원하는 첫 번째 프린터)에 맞는 개체를 찾습니다. 물론 이 경우에도 나름대로 문제가 있지만 일단 프린터가 검색되면 거의 모든 작업을 수행할 수 있습니다.
Visual Basic 2005에서는 이러한 방법이 사용되지 않습니다. 대신 실제 프로그램처럼 사용자가 프린터를 찾을 수 있도록 합니다. 프린터가 선택되면 스트림이 생성되고, 다른 대부분의 Windows 플랫폼 언어와 마찬가지로 여기에 쓰기 작업을 할 수 있습니다. 기능상 기존 Printers 컬렉션을 대체하는 이 컨트롤의 이름은 PrintDialog이며 Windows Forms 도구 상자에서 찾을 수 있습니다.

일반적인 Visual Basic 프로그램의 공통적인 기능 중에는 라인 프린터로 고정 너비 보고서를 출력하는 기능이 있는데, 이는 COBOL 프로그램의 기능을 본뜬 것입니다. Visual Basic 6이 주로 사용되던 시절에는 프린터가 대개 PC의 프린터 포트에 연결되어 있었습니다. 그러나 오늘날에는 네트워크를 통해 원격으로 프린터에 연결할 수 있기 때문에 PrintDialog가 매우 유용합니다.
프린터 검색 후 사용되는 PrintDocument 개체는 Visual Basic 6의 Printer 개체를 .NET 버전으로 약간 변형한 것입니다. PrintDocument 개체를 사용하면 Graphics 개체나 Text 스트림을 프린터에 직접 보낼 수 있습니다. 예전에는 프린터에 텍스트를 보내려면 코드를 줄로 나누고 Win32 호출을 사용해야 했지만 이제는 Stream 개체와 .NET Framework를 사용하여 보다 효과적으로 처리할 수 있습니다.
Visual Basic 6
'이 코드에서는 Form 디자이너에 Printer 개체가 설정되어 있다고 가정합니다.
Private Declare Function WritePrinter Lib "winspool.drv" _
(ByVal hPrn As Long, pBuf As Any, ByVal cdBuf As Long, pcWritten As Long) As Long
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" _
(ByVal pPrinterName As String, phPrn As Long, pDefault As Any) As Long
Private Declare Function StartPagePrinter Lib "winspool.drv" (ByVal hPrn As Long) As Long
'textToWrite는 한 줄의 텍스트라는 점을 기억하십시오.
Public Function WriteTextToPrinter(ByVal textToWrite as String) as Long
Call OpenPrinter(Printer.DeviceName, printerNumber, ByVal 0&)
Printer.FontName = "courier"
Printer.FontSize = 12
lTemp = printerNumber
If lTemp = 0 Then
error = GetLastError
GoTo Exit_Err_Routine
End If
Call StartPagePrinter(printerNumber)
Call WritePrinter(printerNumber, textToWrite, Len(textToWrite), Written)
WriteTextToPrinter = Written
End Function
Visual Basic 2005
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim lineCounter As Integer = 0
Dim linesPerPage As Single = 0
Dim line As String = String.Empty
Dim myFont As Font = New Font("Times New Roman", 12)
Dim printStream As StreamReader = New StreamReader("c:\text.txt")
Dim topOfPage As Single = 0
' 페이지당 줄 수를 계산합니다.
linesPerPage = e.MarginBounds.Height / myFont.GetHeight(e.Graphics)
' 각 줄을 인쇄하면서 파일을 반복합니다.
While lineCounter < linesPerPage
line = printStream.ReadLine()
If line Is Nothing Then
Exit While
End If
topOfPage = 100 + lineCounter * myFont.GetHeight(e.Graphics)
e.Graphics.DrawString(line, myFont, Brushes.Black, 100, _
topOfPage, New StringFormat())
lineCounter += 1
End While
End Sub
기존 PrintForm 메서드는 더 지원되지 않지만 이미지를 프린터에 보내는 더 향상된 방법인 System.Drawing 네임스페이스를 사용하여 작업 중인 이미지까지도 프린터로 직접 전송할 수 있습니다.
Private Sub document_PrintPage(ByVal sender As Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles PrintDocument1.PrintPage
Dim printFont As New System.Drawing.Font _
("Arial", 35, System.Drawing.FontStyle.Regular)
e.Graphics.DrawString("This text is being written to the printer.", _
printFont, Brushes.Black, 10, 10)
'밑줄을 표시해 봅니다.
e.Graphics.DrawLine(Pens.DarkCyan, 10, 40, 200, 40)
End Sub
이러한 기능이 가능한 이유는 PrintPageEventArgs에서 참조 가능한 Graphics 개체를 사용할 수 있고, 일반적으로 Graphics 클래스와 함께 제공되는 모든 Draw... 메서드 집합이 지원되기 때문입니다.
그러나 다른 병렬 포트 장치의 경우 로컬 드라이버를 찾고 Win32 API를 다시 호출해야 합니다. 응용 프로그램에서 IO.DLL 라이브러리를 참조하는 경우 이 라이브러리는 COM 라이브러리이므로 Interop 구성 요소를 생성하여 병렬 포트에 연결된 프린터 이외의 장치에서 읽고 쓸 수 있습니다.
Private Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, _
ByVal Data As Integer)
PortWordOut(23, TextBox1.Text)
같은 종류의 Visual Basic 코드와 매우 비슷하다는 것을 알 수 있습니다.
비디오 모니터 제어
비디오 카드나 모니터의 경우 모뎀이나 프린터와는 달리 C++ 이외의 프로그래밍 언어로 직접적인 상호 작용을 제어할 수 있는 부분이 많지 않습니다. Visual Basic 6 및 Visual Basic 2005에서는 대개 해상도를 확인하기 위한 모니터와의 직접적인 상호 작용으로 제한됩니다.
Visual Basic 6에서는 Screen 개체가 단독으로 이러한 기능을 거의 모두 처리합니다. 게다가 이 개체는 가상의 측정 단위인 트윕을 사용했지만 Visual Basic 2005에서는 이 단위가 보다 일반적인 픽셀로 바뀌었습니다.
이러한 방식이 편리한 면도 있지만 다른 곳에서 종종 사용되는 기능이 감춰진다는 문제점이 있습니다. 그러나 대부분의 모니터 제어 기능은 정상적으로 작동합니다. 모니터와 관련하여 가장 일반적인 기능은 화면의 정확한 위치에 이미지를 표시하는 기능이며 Visual Basic 2005에서는 이러한 기능을 제공합니다.
Visual Basic 6
Dim xCenter, yCenter As Single
xCenter = ((Screen.Width / 2) - (Form1.Width / 2))
yCenter = ((Screen.Height / 2) - (Form1.Height / 2))
Form1.Move xCenter, yCenter
Visual Basic 2005
Dim xCenter, yCenter As Single
xCenter = ((My.Computer.Screen.Bounds.Width / 2) - (Me.Bounds.Width / 2))
yCenter = ((My.Computer.Screen.Bounds.Height / 2) - (Me.Bounds.Height / 2))
Me.Location = New Point(xCenter, yCenter)
드물지만 Visual Basic 6의 기능을 Visual Basic 2005에서 그대로 사용할 경우 화면 관련 구성 요소가 모두 다르기 때문에 문제가 발생할 수 있습니다.
사실 Visual Basic 6 Screen 개체의 속성은 Framework의 특정 기능과 동일한 경우가 많으며 이를 정리하면 다음과 같습니다.
| Visual Basic 6.0 |
Visual Basic 2005 |
| ActiveControl |
System.Windows.Forms.Application.ActiveForm.ActiveControl |
| ActiveForm |
System.Windows.Forms.Application.ActiveForm |
| FontCount |
해당하는 구성 요소가 없습니다. 글꼴 열거 방식이 서로 다릅니다. 자세한 내용은 Font Changes in Visual Basic .NET (영문)을 참조하십시오. |
| Fonts |
System.Drawing.FontFamilies
참고 - 글꼴 열거 방식이 서로 다릅니다. 자세한 내용은 Font Changes in Visual Basic .NET (영문)을 참조하십시오.
|
| Height |
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height |
| MouseIcon |
해당하는 구성 요소가 없습니다. 자세한 내용은 사용자 지정 MousePointer를 설정할 수 없습니다. (영문)를 참조하십시오. |
| MousePointer |
System.Windows.Forms.Cursor
참고 Visual Basic 6.0에서 Screen.MousePointer를 변경하면 Screen.MousePointer를 다시 변경할 때까지 커서 모양이 바뀝니다. Visual Basic .NET에서는 Windows 메시지가 다시 처리될 때까지 즉, 다음 DoEvents가 호출되거나 프로그램이 처리를 끝낼 때까지만 커서가 바뀝니다.
|
| TwipsPerPixelX |
해당하는 구성 요소가 없습니다. Visual Basic .NET에서는 좌표가 픽셀 단위이며 트윕은 측정 단위로 사용되지 않습니다. |
| TwipsPerPixelY |
해당하는 구성 요소가 없습니다. Visual Basic .NET에서는 좌표가 픽셀 단위이며 트윕은 측정 단위로 사용되지 않습니다. |
| Width |
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width |
얼핏 보기에는 상당히 혼란스럽지만 자세히 보면 쉽게 이해할 수 있습니다. 예를 들어 여러 모니터를 사용하는 경우가 있기 때문에 Screen 클래스가 폼의 속성으로 사용됩니다. 필자도 지금 여러 모니터가 연결된 시스템을 사용하여 폼을 가운데 놓기 위해 Visual Basic 6 샘플 응용 프로그램을 수정하고 있습니다. Fonts 클래스도 마찬가지로 상위 엔터티에 포함되어야 합니다. 결국 모든 상황을 고려한 적절한 기능입니다.
IrDA 및 기타 네트워크 장치와 통신
IrDA에 대해 간단히 살펴보겠습니다. Visual Basic 6에서 IrDA는 모뎀과 마찬가지로 MScomm에 의해 제어되며 읽기 가능한 COM 포트가 할당되어야 합니다. IrDA 장치에서 읽고 쓰는 방법은 앞서 예제: 모뎀 연결 섹션에서 살펴본 방법과 비슷합니다. 그러나 프로토콜의 완성도가 약간 떨어져서 많은 개발자가 타사에서 제공하는 ActiveSMS 등의 적외선 장치 컨트롤을 사용합니다.
.NET Framework에서 IrDA는 네트워크 장치로서 System.Net.Sockets에 의해 제어됩니다. 이는 모든 네트워크 장치 문제를 일괄적으로 해결하는 매우 편리한 네임스페이스입니다. Sockets 네임스페이스에 대한 MSDN 설명서에 따르면 지원되는 네트워크 프로토콜은 다음과 같습니다.
- AppleTalk 프로토콜
- 네이티브 ATM 서비스 프로토콜
- Banyan 프로토콜
- X.25 같은 CCITT 프로토콜
- MIT CHAOS 프로토콜
- Microsoft Cluster 제품 프로토콜
- DataKit 프로토콜
- 직접 데이터 연결 프로토콜
- DECNet 프로토콜
- ECMA(European Computer Manufacturers Association) 프로토콜
- FireFox 프로토콜
- NSC HyperChannel 프로토콜
- IEEE 1284.4 작업 그룹 프로토콜
- ARPANET IMP 프로토콜
- IP 버전 4 프로토콜
- IP 버전 6 프로토콜
- IPX 또는 SPX 프로토콜
- IrDA 프로토콜
- ISO 프로토콜
- LAT 프로토콜
- MAX 프로토콜
- NetBIOS 프로토콜
- Network Designers OSI 게이트웨이 사용 가능 프로토콜
- Xerox NS 프로토콜
- OSI 프로토콜
- PUP 프로토콜
- IBM SNA 프로토콜
- Unix 로컬-호스트 프로토콜
- VoiceView 프로토콜
이 중에는 생소하거나 잘 사용하지 않는 프로토콜도 많습니다.
이러한 모든 프로토콜 연결을 처리하는 클래스는 Windows XP의 PocketPC 및 Media Edition 버전에서만 지원되는 System.Net.Irda 네임스페이스에 들어 있지만, 굳이 이 클래스를 사용하지 않더라도 어느 정도의 제어가 가능합니다.
Dim myIrdaEndpoint As IrDAEndPoint = New IrDAEndPoint(irDevices(0).DeviceID, "IrDA Test")
Dim myIrdaListener As IrDAListener = New IrDAListener(myIrdaEndpoint)
myIrdaListener.Start()
Dim myIrdaClient As IrDAClient = myIrdaListener.AcceptIrDAClient()
MessageBox.Show(String.Format("Connected to {0}", myIrdaClient.RemoteMachineName))
myIrdaListener.Stop()
Windows Vista를 실행하는 랩톱에서 IrDA 클래스 사용이 가능한지 여부는 아직 확인되지 않았습니다. 이 사항은 독자 여러분이 직접 확인해 보시기 바랍니다.
결론
현재 필자가 사용하는 My.Computer 네임스페이스에 대해 소개하는 것으로 결론을 대신하도록 하겠습니다. 필자는 이러한 방식으로 통신 장치를 제어하지만, 아시다시피 이외에도 다양한 컴퓨터 하드웨어가 있습니다.
My 개체는 .NET Framework에서 개발자의 생산성을 높이기 위한 "빠른 기능 액세스" 수단으로 고안되었습니다. PC에 연결되는 여러 가지 간단한 장치는 My.Computer 클래스를 사용하여 유지 관리할 수 있습니다.
- My.Computer.Audio - 미디어 및 스피커
- My.Computer.Info - 메모리 및 프로세서
- My.Computer.Keyboard - 키보드 구성
- My.Computer.Mouse - 포인터 위치 등
- My.Computer.Network - System.Net 네임스페이스 클래스 바로 가기
- My.Computer.Ports - 기사 시작 부분에서 설명한 직렬 포트에 대한 액세스
- My.Computer.Screen - 앞에서 살펴본 Visual Basic 6 Screen 개체와 비슷함
My.Computer 개체를 사용하면 여러 가지 면에서 Visual Basic 6에서 제공하는 하드웨어에 보다 쉽게 액세스할 수 있는 반면, .NET Framework는 통합된 플랫폼의 강력한 성능을 제공합니다. Jay Roxe는 Visual Basic 2005가 'Visual Basic 6의 심장과 영혼을 .NET으로 가져온 것'이라고 말했는데 이러한 측면에서 보면 맞는 말입니다.