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

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.0VB2005中的某些数据定义的写法:

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的。ShortIntegerLong都等同于CLRSystem.Int16System.Int32System.Int64类型。


变量声明的变化

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


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

第一行中的a1Variant类型,a2Integer类型。第二行中两个变量都是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中会得到一个编译错误,因为pFor..Next语句块之外不可访问。在VB6.0中这段代码可以通过。



改进了的类型安全

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


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分别返回 010

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.NETObject具备相同能力。


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


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

固定长度字符串

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


布尔操作符
VB6.0
中的AndOr或是Xor语句是按位操作符。而在VB.NET中,它们是布尔操作符。执行这些操作将返回truefalseVB.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
引入新的语法:StructureType…End Type不再被支持。Structure…End StructureC++用法相同。可以指定结构中每个元素的可访问域,如PublicProtectedFriendProtected FriendPrivate等。例如:


Structure StdRec

Public StdId As Integer
Public StdName As String

Private StdInternal As String
End Structure

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

New
Nothing关键字

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

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中,在调用函数或subByRef(传址)是默认类型。那意味着所有改变将反映到传入的变量。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 ApartmentMTA-Multi Threaded Apartment

http://sillyboy422.spaces.live.com/blog/cns!AAB0C086212D33CC!120.entry?wa=wsignin1.0&sa=194042337 

 

 

 

 

 

 

 

你可能感兴趣的:(VB.NET)