Visual Basic 6.0 응용 프로그램의 업그레이드 문제 해결

업데이트: 2007년 11월

Visual Basic 2008의 업그레이드 도구는 업그레이드된 응용 프로그램의 문제점을 감지하고 보고하도록 잘 디자인되어 있지만 일부 문제점은 이 도구에서 감지하지 못할 수도 있습니다. 이 페이지에서는 업그레이드 도구에서 감지하지 못하는 문제점과 이러한 문제점을 해결하는 방법에 대해 설명합니다.

Visual Studio를 업그레이드한 후에 도움말 링크에 액세스할 수 없습니다.

이전 버전의 Visual Studio에서 업그레이드된 응용 프로그램을 작업하면 업그레이드 도구에 의해 삽입된 도움말 링크에서 "페이지를 찾을 수 없습니다."라는 오류가 발생할 수도 있습니다. 이 오류는 링크가 이전 버전에 대한 도움말 컬렉션을 참조하지만 해당 도움말 링크의 형식이 변경된 경우에 발생합니다.

이 문제를 해결하려면 오류 문자열을 복사한 다음 도움말의 검색 기능을 사용하여 해당 항목을 찾으면 됩니다. 일부 오류 문자열에는 변수가 포함되므로 부분 문자열을 검색해야 할 수도 있습니다.

사용자 정의 형식의 고정 길이 문자열에 대한 동작에 차이가 있습니다.

Visual Basic 6.0에서는 사용자 정의 형식의 고정 길이 문자열에 문자열을 할당할 경우 문자열이 고정 길이보다 길면 자동으로 잘립니다. 그러나 Visual Basic 2008로 업그레이드하고 나면 문자열이 더 이상 잘리지 않으므로 이전과는 다른 결과가 발생할 수 있습니다.

참고:

업그레이드하는 동안 사용자 정의 형식의 고정 길이 문자열에는 VBFixedString 특성이 추가됩니다. Visual Basic 호환 라이브러리에 있는 파일 함수에서는 이러한 특성을 가진 문자열을 고정 길이 문자열로 취급합니다.

이 문제를 해결하려면 고정 길이 문자열에 문자열을 할당하는 코드를 찾은 다음, 문자열의 길이를 검사하여 필요한 경우 문자열을 잘라내는 코드를 추가합니다.

' Before
MyString = "1234567"
MyStruct.FixedString5 = MyString

' After
MyString = "1234567"
If Len(MyString) > 5 Then
  MyString = Microsoft.VisualBasic.Left(MyString, 5)
End If
MyStruct.FixedString5 = MyString

폼을 닫으면 Dispose가 호출됩니다.

Visual Basic 6.0에서는 폼을 언로드한 후 나중에 Show 메서드를 호출하여 다시 로드할 수 있습니다. 그러나 Visual Basic 2008에서는 폼에 대한 Close 메서드에서 Dispose 메서드를 호출하여 자동으로 가비지 수집이 수행됩니다. 이로 인해 발견하기 어려운 미묘한 동작 차이가 발생할 수 있습니다.

  • Visual Basic 2008에서는 언로드된 폼에 대해 Show 메서드를 호출하면 폼의 새로운 인스턴스가 생성되어 기본 클래스에서 가져온 속성 설정이 모두 손실됩니다.

  • 모달 형식으로 표시되는 폼에서는 Dispose가 자동으로 호출되지 않습니다. 경우에 따라서는 리소스를 정리하기 위해 Dispose를 호출할 수도 있습니다.

COM 개체에 대해 런타임에 바인딩된 호출을 하면 형식이 일치하지 않는다는 오류가 발생합니다.

Visual Basic 6.0에서는 런타임에 바인딩된 COM 개체를 런타임에 바인딩된 호출에 매개 변수로서 전달하면 개체가 Nothing 형식의 Variant가 됩니다. Visual Basic 2008로 업그레이드하는 경우 Object 형식으로 선언된 COM 개체는 업그레이드하는 동안 항상 Object 형식으로 변환되는 Variants와 동일하게 처리되며 이러한 개체는 variant 형식인 Empty로 마샬링됩니다. 이렇게 되면 Visual Basic 2008에서는 형식 불일치 오류가 발생합니다.

이 문제를 해결하려면 모든 개체를 초기에 바인딩해야 합니다.

Err.Number에서 반환되는 값이 다를 수 있습니다.

Visual Basic 2008에서 반환되는 오류가 Visual Basic 6.0에서 반환되는 오류와 다른 경우도 있습니다. Err.Number에서 반환되는 값을 오류 처리 코드에서 사용하는 경우에는 이로 인해 응용 프로그램에서 다른 동작이 발생할 수도 있습니다.

다음 코드는 이러한 예를 보여 줍니다.

' Visual Basic 6.0
On Local Error GoTo Result
Dim x() As Boolean
Dim y As Variant

y = x(10)

Result:
If Err.Number = 9 Then
   ' Do something.
Else
   ' Do something else.
End If

업그레이드하기 전에 Err.Number에서는 항상 9(범위를 벗어난 첨자)를 반환하고 If 문의 첫 번째 부분을 실행합니다. 그러나 업그레이드한 후에는 91(Object 변수 또는 With 블록 변수가 설정되지 않음)을 반환하고 Else 절을 실행합니다. 이는 Visual Basic 2008에서는 배열을 참조하기 전에 초기화해야 하지만 Visual Basic 6.0에서는 배열이 선언될 때 초기화되기 때문입니다.

Err.Number의 반환 값을 코드에서 사용하는 경우에는 결과를 주의 깊게 테스트하여 필요한 경우 코드를 수정해야 합니다.

참고 항목

개념

Visual Basic 6.0과 현재 버전을 함께 사용하여 작업

기타 리소스

이전 버전의 Visual Basic에서 만든 응용 프로그램 업그레이드