VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#教程 >
  • VB.net 操作API函数的声明方式和数据封送

VB.net 操作API函数的声明方式和数据封送

  •  

 

现在用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
  • 1
  • 2
  • 3
  • 4

第二种声明方式

        '    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
  • 1
  • 2
  • 3

<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)

相关教程