-
vb.Net编程简介之四
内容:
Windows APIs
大多数的API调用可以象在Visual Basic 6.0中一样使用,因为
数据类型发生了改变。在Visual Basic 6.0中
的Long类型在Visual Basic.NET中定义为Integer类型。在升级过程
中这些定义会自动改变,例如:
Private Declare Function GetVersion Lib "kernel32" () As
Long
Function GetVer()
Dim Ver As Long
Ver = GetVersion()
MsgBox ("System Version is " & Ver)
End Function
改变为:
Private Declare Function GetVersion Lib "kernel32" () As
Integer
Function GetVer()
Dim Ver As Integer
Ver = GetVersion()
MsgBox("System Version is " & Ver)
End Function
除了数字类型的升级外,Visual Basic 6.0还支持固定长度字符
串类型,该类型升级到Visual Basic.NET后
会定义为固定长度字符串兼容类。
所以在Visual Basic 6.0代码中最好使用通用字符串定义,例如:
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
上面的代码出现了固定长度字符串,最好更改为:
Dim Buffer As String
Buffer = String$(25, " ")
升级到Visual Basic.NET后会称为下面的样子:
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
关键字定义字符串传递的方式。
有三种情况需要对代码最手工改进。
1、在传递给API函数的自定义数据类型定义中包含固定长度字符串和
数组。在Visual Basic.NET中你需要对自定
义数据类型定义中的每一个固定长度
字符串和数组添加MarshallAs 属性。
2、在定义中使用As Any声明。该种声明不再被Visual Basic.NET支
持,变量定义为As Any通常是为了传递一个既
可能是字符串也可能是Null的变量,在Visual Basic.NET中,你可以
定义两个不同类型的API,一个为Long类型,
一个为String类型,以API函数GetPrivateProfileString 为例:
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树脂:
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
当你希望传递Null数值时,使用GetPrivateProfileStringNullKey。
3、如果你的程序中有诸如建立线程、Windows子类(subclassing),
消息钩子等API调用时,这些函数在
Visual Basic.NET下可能会产生运行时错误。很多这些API在Visual
Basic.NET或者.NET架构中有等价的函数。
Windows APIs
大多数的API调用可以象在Visual Basic 6.0中一样使用,因为
数据类型发生了改变。在Visual Basic 6.0中
的Long类型在Visual Basic.NET中定义为Integer类型。在升级过程
中这些定义会自动改变,例如:
Private Declare Function GetVersion Lib "kernel32" () As
Long
Function GetVer()
Dim Ver As Long
Ver = GetVersion()
MsgBox ("System Version is " & Ver)
End Function
改变为:
Private Declare Function GetVersion Lib "kernel32" () As
Integer
Function GetVer()
Dim Ver As Integer
Ver = GetVersion()
MsgBox("System Version is " & Ver)
End Function
除了数字类型的升级外,Visual Basic 6.0还支持固定长度字符
串类型,该类型升级到Visual Basic.NET后
会定义为固定长度字符串兼容类。
所以在Visual Basic 6.0代码中最好使用通用字符串定义,例如:
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
上面的代码出现了固定长度字符串,最好更改为:
Dim Buffer As String
Buffer = String$(25, " ")
升级到Visual Basic.NET后会称为下面的样子:
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
关键字定义字符串传递的方式。
有三种情况需要对代码最手工改进。
1、在传递给API函数的自定义数据类型定义中包含固定长度字符串和
数组。在Visual Basic.NET中你需要对自定
义数据类型定义中的每一个固定长度
字符串和数组添加MarshallAs 属性。
2、在定义中使用As Any声明。该种声明不再被Visual Basic.NET支
持,变量定义为As Any通常是为了传递一个既
可能是字符串也可能是Null的变量,在Visual Basic.NET中,你可以
定义两个不同类型的API,一个为Long类型,
一个为String类型,以API函数GetPrivateProfileString 为例:
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树脂:
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
当你希望传递Null数值时,使用GetPrivateProfileStringNullKey。
3、如果你的程序中有诸如建立线程、Windows子类(subclassing),
消息钩子等API调用时,这些函数在
Visual Basic.NET下可能会产生运行时错误。很多这些API在Visual
Basic.NET或者.NET架构中有等价的函数。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式