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

第二种声明方式

        '    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

最后介绍一个有关VB.Net的API函数的网站,这个网站的东西真的很有用
pinvoke.net(http://www.pinvoke.net/default.aspx)

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值