今天在做一个关于IC卡读写的程序,用到了一个IC卡读写器,有一个配套的dll动态库和一些库函数的说明,但是调试的时候总是会遇到一些奇怪的现象。VB6的示例中可以的操作,在我的程序中就会出现“未将对象引用设置到对象的实例”等等错误。折腾了半天也没有什么进展。后来用.NET的升级向导将那个VB6的实力程序升级,发现模块中函数的声明有一些变化。
VB6中声明:
Declare Function srd_45d041 Lib "mwic_32.dll" (ByVal icdev As Long, ByVal page As Integer, ByVal offset As Integer, ByVal le As Long, ByVal data_buffer$) As Integer
升级后.NET的声明:
Declare Function srd_45d041 Lib "mwic_32.dll" (ByVal icdev As Integer, ByVal page As Short, ByVal offset As Short, ByVal le As Integer, ByVal data_buffer As String) As Short
VB6中Long类型在.NET中变成了Integer,而Integer变成了Short。就这么一点小小的问题搞得我郁闷了半天。把程序调试通过以后,我查了一下MSDN Library,发现.NET的数据类型和VB6的存在一些变化。具体的可以看下面这两张表。
表1 VB6中的数据类型
数据类型
存储空间大小
范围
Byte
1 个字节
0 到 255
Boolean
2 个字节
True 或 False
Integer
2 个字节
-32,768 到 32,767
Long
(长整型)
4 个字节
-2,147,483,648 到 2,147,483,647
Single
(单精度浮点型)
4 个字节
负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38
Double
(双精度浮点型)
8 个字节
负数时从 -1.79769313486232E308 到
-4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308
Currency
(变比整型)
8 个字节
从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807
Decimal
14 个字节
没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001
Date
8 个字节
100 年 1 月 1 日 到 9999 年 12 月 31 日
Object
4 个字节
任何 Object 引用
String
(变长)
10 字节加字符串长度
0 到大约 20 亿
String
(定长)
字符串长度
1 到大约 65,400
Variant
(数字)
16 个字节
任何数字值,最大可达 Double 的范围
Variant
(字符)
22 个字节加字符串长度
与变长 String 有相同的范围
用户自定义
(利用 Type)
所有元素所需数目
每个元素的范围与它本身的数据类型的范围相同。
表2 VB.NET中的数据类型
Visual Basic 类型
公共语言运行库类型结构
名义存储分配
取值范围
Boolean
System.Boolean
2 个字节
True 或 False
Byte
System.Byte
1 个字节
0 到 255(无符号)。
Char
System.Char
2 个字节
0 到 65535(无符号)。
Date
System.DateTime
8 个字节
0001 年 1 月 1 日凌晨 0:00:00 到 9999 年 12 月 31 日晚上 11:59:59。
Decimal
System.Decimal
16 个字节
0 到 +/-79,228,162,514,264,337,593,543,950,335 之间不带小数点的数;
0 到 +/-7.9228162514264337593543950335 之间带 28 位小数的数;最小非零数为
+/-0.0000000000000000000000000001 (+/-1E-28)。
Double
(双精度浮点型)
System.Double
8 个字节
负值取值范围为 -1.79769313486231570E+308 到 -4.94065645841246544E-324;正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。
Integer
System.Int32
4 个字节
-2,147,483,648 到 2,147,483,647。
Long
(长整型)
System.Int64
8 个字节
-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
Short
System.Int16
2 个字节
-32,768 到 32,767。
Object
System.Object(类)
4 个字节
任何类型都可以存储在 Object 类型的变量中。
Single
(单精度浮点型)
System.Single
4 个字节
负值取值范围为 -3.4028235E+38 到 -1.401298E-45;正值取值范围为 1.401298E-45 到 3.4028235E+38。
String
(变长)
System.String(类)
取决于实现平台
0 到大约 20 亿个 Unicode 字符。
用户定义的类型
(结构)
(从System.ValueType继承)
取决于实现平台
结构中的每个成员都有由自身数据类型决定的取值范围,并与其他成员的取值范围无关。
从两张表中可以清楚地看到VB6中的Integer类型是2个字节长度的,Long是4个字节长度的。在.NET中Interger变成了4个字节,Long是8个字节。多了一个Short类型,是2个字节的。
数据类型的字长不一样导致了调用库函数时数据类型转化的冲突,所以也就出现了很多奇怪的问题,不过现在问题顺利解决,希望这些经验能对.NET的初学者有一些帮助。