Техническая поддержка :

Современные решения

для защиты Windows программ

и восстановления исходного кода
Автор: Mr.Young. Дата публикации: 04.08.2004

Преобразование ваших проектов из VB6 в VB.NET

Windows API

Во многих вызовах API функций, используемых в Visual Basic 6.0, придется корректировать типы данных соответственно новому стандарту. Поскольку в VB 6.0, тип данных Long соответствует типу Integer в VB.NET, а тип Integer из VB6 новому типу Short. Эти изменения сделаны для облегчения использования API функций в ваших приложениях. Смотрите пример:

CODE NOW!
Private Declare Function GetVersion Lib "kernel32" () As Long
Function GetVer()
Dim Ver As Long
Ver = GetVersion()
MsgBox ("Версия Windows " & Ver)
End Function



Заменяем на:

CODE NOW!
Private Declare Function GetVersion Lib "kernel32" () As Integer
Function GetVer()
Dim Ver As Integer
Ver = GetVersion()
MsgBox("Версия Windows " & Ver)
End Function



В добавок к изменённым числовым типам данных, изменён и тип String, в VB 6.0 строка могла быть фиксированной длинны, а теперь это не поддерживается и Вам придется обращаться к классу String для установки длинны строки. Смотрите пример:

CODE NOW!
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 символов, например так:

CODE NOW!
Dim Buffer As String
Buffer = String$(25, " ")



Вот как будет выглядеть в Visual Basic.NET :

CODE NOW!
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



В некоторых случаях, Visual Basic.NET позволяет лучше передавать дескриптор строк API функциям, Вы можете произвольно объявлять то как хотите использовать строку, как ANSI или как UNICODE символы.

Есть три случая, когда Вы должны будите сделать некоторые изменения. Во первых, передаче API функции пользовательский типов данных содержащих строки фиксированной длинны или массив байтов. В VB.NET Вы должны будите изменить свой код, добавив атрибуты (из System.Runtime.InteropServices) к каждой строке фиксированной длины или байтовому массиву. Во вторых использование при объявление функции переменной типа As Any, не поддерживается в VB.NET. Переменные типа As Any часто используются для передачи строк или пустых указателей (Null); Вы можете заменить используемое в VB 6.0 объявление функции на два, одно с Long, другое со String. Для примера рассмотрим параметр lpKeyName, функции GetPrivateProfileString, он имеет тип As Any:

CODE NOW!
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



Вы удаляете объявление с типом As Any, заменяя его на две версии объявления с Long и String:

CODE NOW!
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 Long, _
ByVal lpFileName As String) As Long

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



Когда Вы хотите передать функции пустой указатель, используйте версию GetPrivateProfileStringNullKey. Имейте введу, что делая подобное преобразование вызовов функций Вам все ровно придётся, при переходе на Visual Basic.NET, так что лучше делать это уже сейчас.

И наконец, Вы должны будите сделать некоторые изменения если используете API для создания потоков, субкластинга, ловушек и т.д. Некоторые из этих функций вызовут ошибку периода время выполнения (run-time error) в Visual Basic.NET. Многие API функции имеют эквивалент в Visual Basic.NET или в .NET Framework. Вы должны будите изменять их от случая к случаю.

Полная версия статьи находится на http://msdn.microsoft.com/library/techart/vb6tovbdotnet.htm

Формы и элементы управления

Visual Basic.NET использует новое соглашение для форм, Windows Forms. Windows Forms практически совместимы с формами Visual Basic 6, однако имеются некоторые ключевые различия, которые приведены ниже:

Windows Forms не поддерживают элемент управления OLE container control. Вы должны избегать использования этого элемента управления в ваших приложениях создаваемых в Visual Basic 6.0

Отсутствует контрол Shape в Windows Forms. Квадраты и прямоугольники будут заменены Labels, в то время как круги и овалы не будут изменены. Вы должны избегать использования их в ваших приложениях.

В Windows Forms не будет элемента Line. Горизонтальные и вертикальные линии будут включены в Labels. Диагональные линии останутся без изменений, Вы должны избежать их использования.

Новые команды для работы с графикой заменят методы Формы, такие как, Circle, CLS, PSet, Line, и Point. Поскольку новая объектная модель отлична от используемой в Visual Basic 6.0, то эти методы не могут быть обновлены.

Для элемента управления Timer, свойство Interval установление в 0 не отключает таймер, а сбрасывает на 1. В проектах Вы должны будите заменить свойство Interval = 1 на Enabled = False.

Windows Forms имеется два средства управления меню, MainMenu и ContextMenu, принимая во внимание, что в Visual Basic 6.0 только один элемент управления меню, который может быть открыт как MainMenu или ContextMenu. Элемент управления меню заменится на MainMenu, Вам придется заново создавать контекстное меню используя ContextMenu.

Windows Forms не будет поддерживать динамический обмен данными (DDE).

Windows Forms не будет метода Form.PrintForm.

Хотя Windows Forms будет поддерживать drag-and-drop, объектная модель совершенна другая Visual Basic 6.0. Поэтому используемые в Visual Basic 6.0 свойства и методы drag-and-drop обновлены не будут.

Структура .NET имеет улучшенный объект Clipboard (System.WinForms.Clipboard), это предполагает больше функциональных возможностей и большее количество поддерживаемых форматов объект Clipboard в Visual Basic 6.0. Однако, из-за различий между объектными моделями, инструкции буфера обмена не могут быть автоматически модернизированы.

Windows Forms не будут поддерживать свойство Name у форм и контролов, перебор всех контролов для поиска контрола с нужным именем работать не будет. Hо это можно будет сделать по-другому

Чтобы гарантировать правильные размеры ваших форм, всегда в своих приложениях, используйте ScaleMode = twips. После обновления, Visual Basic.NET автоматически преобразует твипы в пиксели.

Windows Forms поддерживает только шрифты true-type и open-type. Если в вашем приложении используются другие шрифты, то они будут заменены на шрифты установленные в системе по умолчанию, при этом все элементы форматирования (размер, курсив и т.д.) будет потеряно. В VB 6.0 везде по умолчанию используется шрифт MS Sans Serif. По этой причине, рекомендуется использовать Arial, везде где Вы применяете форматирование текста.

Полная версия статьи находится на http://msdn.microsoft.com/library/techart/vb6tovbdotnet.htm


Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий:





Главная     Программы     Статьи     Разное     Форум     Контакты