다음을 통해 공유


업그레이드 권장 사항: Win32 API용으로 데이터 형식 조정

업데이트: 2007년 11월

대부분의 API는 Visual Basic 6.0에서와 똑같이 사용할 수 있지만 데이터 형식을 적절히 조정해야 한다는 경고가 표시됩니다. 이제 Visual Basic 6.0의 Long 데이터 형식은 Visual Basic 2008의 Integer 데이터 형식이 되고 Visual Basic 6.0의 Integer 데이터 형식은 Visual Basic 2008의 Short 데이터 형식이 됩니다. 업그레이드하는 동안 이러한 변경이 수행되고 단순한 API는 Visual Basic 6.0에서와 동일하게 동작합니다. 예를 들면 다음과 같습니다.

Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
    Dim Ver As Long
    Ver = GetVersion()
    MsgBox ("System Version is " & Ver)
End Function

이 코드는 다음과 같이 변경됩니다.

Private Declare Function GetVersion Lib "kernel32" () As Integer
Function GetVer()
    Dim Ver As Integer
    Ver = GetVersion()
    MsgBox("System Version is " & Ver)
End Function

숫자 데이터 형식뿐만 아니라 Visual Basic 2008에서 지원되지 않는 Visual Basic 6.0의 고정 길이 문자열 데이터 형식도 고정 길이 문자열 래퍼 클래스로 업그레이드됩니다. Visual Basic 6.0에서는 대부분의 경우 정상적인 문자열을 사용하여 동일한 동작을 수행할 수 있습니다. 예를 들면 다음과 같습니다.

Private Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Long) As Long
Function GetUser()
    Dim Ret As Long
    Dim UserName As String
    Dim Buffer As String * 25
    Ret = GetUserName(Buffer, 25)
    UserName = Left$(Buffer, InStr(Buffer, Chr(0)) - 1)
    MsgBox (UserName)
End Function

고정 길이 문자열 대신 정상적인 문자열을 사용하여 명시적으로 길이를 25로 설정하면 위의 코드를 다음과 같이 더 훌륭한 코드로 작성할 수 있습니다.

Dim Buffer As String
Buffer = String$(25, " ")

이 예제를 Visual Basic 2008로 업그레이드하면 다음과 같습니다.

Declare Function GetUserName Lib "advapi32.dll" Alias _ 
"GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Function GetUser()
    Dim Ret As Integer
    Dim UserName As String
    Dim Buffer As String
    Buffer = New String(CChar(" "), 25)
    Ret = GetUserName(Buffer, 25)
    UserName = Left(Buffer, InStr(Buffer, Chr(0)) - 1)
    MsgBox(UserName)
End Function

ANSI 및 UNICODE 키워드를 사용하여 문자열을 전달하는 방식을 선택적으로 선언할 수 있기 때문에 경우에 따라서는 Visual Basic 2008에서 문자열을 API로 전달하는 동작을 더 잘 처리할 수도 있습니다.

다음 세 가지 경우에는 코드의 일부를 변경해야 합니다. 첫 번째는 고정 길이 문자열이나 바이트 배열을 가진 사용자 정의 형식을 API로 전달하는 경우입니다. 이 경우 Visual Basic 2008에서는 System.Runtime.InteropServices 네임스페이스의 MarshallAs 특성을 사용자 정의 형식의 각 고정 길이 문자열이나 바이트 배열에 추가하여 코드를 변경해야 합니다. 두 번째는 Declare 문에서 As Any 변수 형식을 사용하는 경우입니다. 이 경우는 Visual Basic 2008에서 지원되지 않습니다. As Any 형식의 변수는 주로 문자열 변수나 Null 변수를 전달하는 데 사용되었습니다. 두 가지 형태, 즉 long 형식과 문자열 형식으로 API를 선언하여 이 Visual Basic 6.0 형식을 대체할 수 있습니다. 예를 들어, GetPrivateProfileString API에는 As Any 형식의 lpKeyName 매개 변수가 있습니다.

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias _
"GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _
lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString _
As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Declare를 다음과 같이 각각 long 형식과 문자열 형식을 사용하는 두 가지 버전으로 대체하면 "As Any"를 제거할 수 있습니다.

Private Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias _
"GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _
lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString _
As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer

Private Declare Function GetPrivateProfileStringNullKey Lib "kernel32" _
Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _
ByVal lpKeyName As Integer, ByVal lpDefault As String, ByVal _
lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName _
As String) As Integer

Null 값을 API로 전달하려면 GetPrivateProfileStringNullKey 버전을 사용합니다. 이 방법을 사용하면 해당 함수가 Visual Basic 2008로 업그레이드됩니다.

마지막으로 스레드 만들기를 수행하고, Windows 클래스에서 파생되고, 메시지 큐 후킹을 수행하는 등의 작업을 수행하는 API를 사용하는 경우에는 일부를 변경해야 합니다. 이러한 함수 중 일부는 Visual Basic 2008에서 런타임 오류를 발생시킬 수 있습니다. Visual Basic 2008 또는 .NET Framework에는 이러한 많은 API에 대응하는 요소가 있습니다. 이러한 API는 사례별로 수정해야 합니다.

참고 항목

기타 리소스

업그레이드를 위한 언어 권장 사항