现在用VB的人越来越少了,有些东西只能从C#上迁移过来。
第一次写博客,不怎么会,但是又想把自己所探索到的知识记录并保存下来,以便后面查看。
VB6.0的时候用了很多API函数,虽然VB.Net功能强大,但是有些东西一下还搞不来,所以还是打算用以前的API函数,试了几个API函数,发现出现了问题。
先介绍一下VB.Net中API函数的声明方式。以GetUserName为例。
第一种声明方式。Shared 这个关键字不能少
<DllImport("advapi32.dll", EntryPoint:="GetUserNameW", SetLastError:=True)> _
Private Shared Function GetUserName(<MarshalAs(UnmanagedType.LPTStr)> ByVal sb As System.Text.StringBuilder, _
ByRef length As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
第二种声明方式
' Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameW" _
'(<MarshalAs(UnmanagedType.LPTStr)> ByVal lpBuffer As System.Text.StringBuilder, _
'ByRef length As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
<MarshalAs(UnmanagedType.LPTStr)> 这个东西表示 数据封送
API函数一般有两种 回调字符串形式(ANSI 和 Unicode),对应的有两种 连接函数名,以GetUserName为例,GetUserName有GetUserNameA和GetUserNameW,函数后缀名A表示ANSI,W表示宽字符(Unicode),UnmanagedType 也有两种形式 ,其中 UnmanagedType.LPTStr 对应 Unicode ,UnmanagedType.LPStr 对应 ANSI,不对应 回调字符串就会返回乱码。
下面是调用API函数的实例代码
Imports System
Imports System.Text
Imports System.Runtime.InteropServices
Namespace GetUserNameExample
Class Class1
'<DllImport("advapi32.dll", EntryPoint:="GetUserNameA", SetLastError:=True)> _
'Public Function GetUserName(<MarshalAs(UnamagedType.LPTSTR)>System.Text.StringBuilder sb, _
' ByRef length As Integer) As <MarshalAs(UnmanagedType.Bool)>Boolean
'End Function
'Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, ByRef nMax As Integer) As Boolean
<DllImport("advapi32.dll", EntryPoint:="GetUserNameW", SetLastError:=True)> _
Private Shared Function GetUserName(<MarshalAs(UnmanagedType.LPTStr)> ByVal sb As System.Text.StringBuilder, _
ByRef length As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
'Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
' (<MarshalAs(UnmanagedType.LPTStr)> ByVal sb As System.Text.StringBuilder, _
' ByRef length As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
' Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameW" _
'(<MarshalAs(UnmanagedType.LPTStr)> ByVal lpBuffer As System.Text.StringBuilder, _
'ByRef length As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
' '非托管函数后缀名A表示ANSI,W表示宽字符(Unicode),如GetUserName有GetUserNameA和GetUserNameW
' 'A表示ANSI 用 UnmanagedType.LPTStr ;W表示宽字符(Unicode) 用UnmanagedType.LPStr
<STAThread()> _
Public Sub Main()
Dim Buffer = New StringBuilder(64)
'Dim Buffer As String = Space(64)
Dim nSize As Integer = 64
GetUserName(Buffer, nSize)
Console.WriteLine(Buffer.ToString())
MsgBox(Buffer.ToString())
End Sub
End Class
End Namespace
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
最后介绍一个有关VB.Net的API函数的网站,这个网站的东西真的很有用 pinvoke.net(http://www.pinvoke.net/default.aspx)