您的位置:首页 > 编程语言 > VB

20100625 学习记录:VB6.0→VB.NET

2010-06-29 10:24 309 查看
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As HookType, ByVal lpfn As HOOKPROC, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer

Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer

Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal ncode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

在vb.net中对API的调用和Hook的实现上作了什么样的变化呢?

1. integer代替了long

因为vb.net中integer定义为32位(4字节)的整数,值的范围是-231到231(首位是符号位),这与vb6中long的定义是一致的,因此,我们必须做一下这样的转换。

2. hnextHookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf _
MyKBHFunc, App.hInstance, 0)

Lpfn在这里被表示为AddressOf MyKBHFunc,即说明Hook发生作用时,调用的子程是MyKBHFunc。也就是说lpfn表示的是函数或过程的地址。在vb6中用long类型就可以记录下函数或过程的地址。

在 vb.net中,有了一点小变化喽,AddressOf 运算符创建的是一个指向指定的子程的子程委托。当指定的子程是一个实例方法时,子程委托同时引用实例和方法,以便当调用该子程委托时,调用指定实例的指定 方法。AddressOf 运算符可以用作委托构造函数的操作数,或可以用在编译器能够确定委托类型的上下文中。

所以,正是由于Addressof创建的不再只是简单的函数指针了,而是子程委托!

事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的 对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。在事件通讯中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需 要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET 框架定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。看,这里提到了.net框架,所以C#等vs.net中的语言都可以有这个类 型喽。

委托就是可用于调用其他对象方法的对象。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委 托就等效于一个类型安全函数指针或一个回调。因为它们与其他编程语言中所使用的函数指针相似。但不同于函数指针,Visual Basic.NET 委托是基于 System.Delegate 类的引用类型,它可以引用共享方法—无需特定即可调用的方法—和实例方法。

from: http://www.ddway.com/ShowDetail_5357.aspx
1. VB6.0中的App.Path 在VB2005中写成 Application.StartupPath (获取相对路径) 或(System.win32.Application.StartupPath)

Myname = Dir(Application.StartupPath, vbDirectory)获取当前目录名

2. VB.NET的Integer相当于VB的Long
VB.net不再支持As Any,必须具体声明所有参数和返回值的数据类型。

3. VB6.0与VB2005中的某些数据定义的写法:
VB6.0:  Public Const INTERNET_FLAG_RELOAD = &H80000000

VB2005:  Public Const GENERIC_READ As Integer = &H80000000

6.0中的 long 在2005中改成 Integer ,any 改为 String

6.0: Dim wndid

2005: Dim wndid as object

VB6.0:定义

dwSize As Long

RasConnState As Long

szEntryName(ras_maxentryname) As Byte

szDeviceType(ras_maxdevicetype) As Byte

szDeviceName(ras_maxdevicename) As Byte

End Type

VB2005:定义

Structure RasConnStatus

Dim dwSize As Integer

Dim RasConnState As Integer

<VBFixedArray(ras_maxentryname)> Dim szEntryName() As Byte

<VBFixedArray(ras_maxdevicetype)> Dim szDeviceType() As Byte

<VBFixedArray(ras_maxdevicename)> Dim szDeviceName() As Byte

Public Sub Initialize()

ReDim szEntryName(ras_maxentryname)

ReDim szDeviceType(ras_maxdevicetype)

ReDim szDeviceName(ras_maxdevicename)

End Sub

End Structure
http://hi.baidu.com/ha_yuki/blog/item/f9bdcd8b8183087c9f2fb471.html

从VB到VB.NET(4)

1.9 VB6.0与VB.NET的不同之处

除了上面谈到的语言进化,还有一些语法上的变化。所有这些语言和语法的变化在MSDN中均可查到,本文只作简单介绍。

数据类型(Data Type)的改变

VB.NET中有些数据类型得到改进。下面是变化对照表。

数据类型

VB6.0

VB.NET

Integer

16 bit size

32 bit size

Long

32 bit size

64 bit size

Currency

用于存储大浮点数

被decimal替代,支持更高精度

Variant

可以存储任意类型数据

被Object类型替代,也可以存储任意类型数据,但结果更好

Date

Date类型被存储为double

引入DateTime类型,用于存储不同格式的日期

在VB.NET中,Short数据类型是16 bit的。Short,Integer和Long都等同于CLR的System.Int16、System.Int32和System.Int64类型。

变量声明的变化

在VB6.0中,变量声明有许多限制。其中之一就是不能同行声明多个变量。如果一定要在一行中声明多个变量,就一定得指明每个变量的类型,否则将被默认为Variant类型。

Dim a1, a2 As Integer
Dim a3 As Integer, a4 As Integer

第一行中的a1是Variant类型,a2是Integer类型。第二行中两个变量都是Integer类型。

VB.NET支持同行声明多个变量,举例如下:

Dim a1, a2, a3 As Integer

变量初始化是另一个问题。在VB6.0中不能同时声明和初始化变量,而VB.NET则支持这个特性。

Dim name As String = "Mahesh"
System.Console.Write(name)

声明常量也可以照此办理:

Const DT_COUNT As Integer = 23

New关键字。在VB.NET中,New关键字用于创建对象。由于数据类型是对象,所以New关键字用以创建一个数据类型对象。

Dim i As Integer = New Integer()
i = 10
System.Console.WriteLine(i.ToString())

代码块级别支持。像C++一样,VB.NET支持代码块级别的作用域检查。在语句块中声明的变量只在块内有效。

For i = 1 To 10
Dim p As Long
System.Console.WriteLine(i.ToString())
Next
System.Console.WriteLine(p.ToString())

这段代码在VB.NET中会得到一个编译错误,因为p在For..Next语句块之外不可访问。在VB6.0中这段代码可以通过。

改进了的类型安全

在VB6.0中,当你声明一个对外部过程的引用时,可以指定任意类型的参数为As Any。Any关键字禁止了类型检查,允许任意数据类型传入和返回。

VB.NET不支持Any关键字。你必须指定每个参数和返回值的数据类型。

数组
VB.NET对数组作了明显的改动。

数组范围。在VB.NET中,你需要格外留意数组范围问题。VB6.0默认数组下界为0,故数组中的元素数量等与数组上界值加一。下面的数组界限从A(0)到A(10),共有11个元素:

Dim A(10) As Single

可以使用Option Base改变下界值为1。在VB.NET中,数组和C++一样,下界值为0,不支持Option Base。

注意:MSDN文档指出数组只能包括与其尺寸相等的元素数量,例如:

Dim A(10) As Integer

只能包括10个元素(从A(0)到A(9)),但在编译下面这段代码时我发现它运行良好,看起来数组中容纳了11个元素。

Dim A(10) As Integer
A(0) = 12
A(2) = 24
A(10) = 23

System.Console.WriteLine(A(0).ToString())
System.Console.WriteLine(A(10).ToString())
System.Console.WriteLine(UBound(A).ToString())
System.Console.WriteLine(LBound(A).ToString())

Lbound和Ubound分别返回 0与10。

ReDim和Fixed Array。你可以在VB6.0中指定固定长度的数组。

Dim ArrWeekDays(0 To 6) As Integer

这里的ArrWeekDays数组是固定长度的,不能用ReDim语句改变长度。VB.NET不支持固定长度数组,所以ReDim总是有效。

可以用下面两种方式声明数组:

Dim ArrWeekDays(6) As Integer
Dim ArrWeekDays() As Integer = {1, 2, 3, 4, 5, 6}

ReDim语句。在VB6.0中,ReDim用于初始化动态数组。在VB.NET中你不能把它当作声明用。ReDim只能用于改变数组长度,不过不能改变数组维度。

Variant对阵Object
VB6.0中的Variant数据类型能存储任意类型变量,VB.NET中Object具备相同能力。

算术操作符
VB.NET支持类似C++的快捷方式。下面的表格显示了常规操作与快捷操作的不同之处。快捷方式也可用于*、/、|、&等操作符。

操作符 常规语法 快捷方式
加法 A = A+5 A +=5
减法 A = A – 5 A -+ 5

固定长度字符串

在VB6.0中,可以在声明字符串时指定其长度。VB.NET不支持固定长度字符串。

布尔操作符
VB6.0中的And、Or或是Xor语句是按位操作符。而在VB.NET中,它们是布尔操作符。执行这些操作将返回true或false。VB.NET引入新操作符来完成按位操作。

操作符 描述

BitAnd 按位And
BitOr 按位Or
BitXor 按位Xor
BitNot 按位Not

结构与自定义类型
在VB6.0中,你使用Type…End Type语句块创建结构或自定义类型。例如:

Type StdRec

StdId As Integer

StdName As String
End Type

VB.NET引入新的语法:Structure。Type…End Type不再被支持。Structure…End Structure与C++用法相同。可以指定结构中每个元素的可访问域,如Public、Protected、Friend、Protected Friend、Private等。例如:

Structure StdRec

Public StdId As Integer
Public StdName As String

Private StdInternal As String
End Structure

VB.NET中的Structures就像类一样,也可以拥有方法和属性。

NewNothing关键字

VB6.0中,AS New和Nothing关键字用于声明一个对象并初始化它。

VB.NET不支持隐式创建对象。如前所言,甚至连数据类型都是对象。你可以采用以下两种方法创建数据类型或对象:

Dim i As Integer
Dim i As Integer = New Integer()
// Do something
if i = Nothing Then
End If

不支持Set语句
VB6.0使用Set语句指派对象。例如:

Set myObj = new MyObject
Set a = b

在VB.NET中,不需要使用Set指派对象。例如:

myObj = new MyObj()
a = b

过程(procedure)语法的变化在VB.NET中过程语法有了很多变化。例如类似C++的过程调用方式、ByVal(传值)为默认类型、Optional关键字、return语句等等。
类似C++的过程调用方式
VB6.0允许不用加圆括号调用过程(sub)。不过,用Call语句调用函数或sub时,一定要使用圆括号。例如:

Dim I as Integer
Call EvaluateData(2, i)
EvaluateData 2, i

在VB.NET中,所有的方法调用都需要圆括号,而Call语句则是可选的。

ByVal是默认参数类型
在VB6.0中,在调用函数或sub时ByRef(传址)是默认类型。那意味着所有改变将反映到传入的变量。VB.NET改变了这种方式。现在,默认的参数类型是ByVal(传值)。

Optional关键字
VB6.0使用Optional关键字可用来让用户决定传入一个默认值,之后在调用IsMissing函数判断参数是否有效。

而在VB.NET中,每个可选参数必须声明其默认值,无需调用IsMissing函数。例如:

Sub MyMethod(Optional ByVal i As Integer = 3)

Return语句
VB.NET的Return语句与C++相似。使用Return语句把控制权从过程返还给调用者。在VB6.0中,Return语句与GoSub语句一起使用。VB.NET不再支持GoSub语句。

流程控制的改变
下面是VB.NET对流程控制语句的修改:

1. GoSub不再受到支持。

2. Call、Function和Sub语句均可用于调用过程。

3. On ... GoSub和On ... GoTo语句不再受支持。可以使用Select Case语句来替代。

4. While ... Wend语句现在改为While…End While语句。不再支持Wend关键字。

小结
Visual Basic .NET是.NET版本的Visual Basic。通过本文你了解到VB.NET的基本概念,而且也从VB6.0开发者的角度对VB.NET进行了考察。
[1] 译注:这意味着你无需购买VS.NET即可进行VB.NET开发

[2] 译注:STA-Single Threaded Apartment;MTA-Multi Threaded Apartment
http://sillyboy422.spaces.live.com/blog/cns!AAB0C086212D33CC!120.entry?wa=wsignin1.0&sa=194042337
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: