VB.NET通过Win32API完成访问共享文件夹功能中

VB.NET通过Win32API完成访问共享文件夹功能

VB.NET通过Win32API完成访问共享文件夹功能

VB.NET实现访问网络共享文件夹,使用 WNetAddConnection2A 和 WNetCancelConnection2A。

Imports System
Public Class clsNetworkConnect

#Region "----- Win32API关联 常量 -----"
    '------------------------------------------------ 
    ' 访问共享文件夹 常量 
    '------------------------------------------------ 
    Public Const RESOURCE_CONNECTED = &H1
    Public Const RESOURCE_GLOBALNET = &H2
    Public Const RESOURCE_REMEMBERED = &H3
    Public Const RESOURCE_RECENT = &H4
    Public Const RESOURCE_CONTEXT = &H5

    Public Const RESOURCETYPE_ANY = &H0
    Public Const RESOURCETYPE_DISK = &H1
    Public Const RESOURCETYPE_PRINT = &H2
    Public Const RESOURCETYPE_RESERVED = &H8
    Public Const RESOURCETYPE_UNKNOWN = &HFFFFFFFF

    Public Const RESOURCEUSAGE_CONNECTABLE = &H1
    Public Const RESOURCEUSAGE_CONTAINER = &H2
    Public Const RESOURCEUSAGE_NOLOCALDEVICE = &H4
    Public Const RESOURCEUSAGE_SIBLING = &H8
    Public Const RESOURCEUSAGE_ATTACHED = &H10
    Public Const RESOURCEUSAGE_ALL = RESOURCEUSAGE_CONNECTABLE + RESOURCEUSAGE_CONTAINER + RESOURCEUSAGE_ATTACHED
    Public Const RESOURCEUSAGE_RESERVED = &H80000000

    Public Const RESOURCEDISPLAYTYPE_GENERIC = &H0
    Public Const RESOURCEDISPLAYTYPE_DOMAIN = &H1
    Public Const RESOURCEDISPLAYTYPE_SERVER = &H2
    Public Const RESOURCEDISPLAYTYPE_SHARE = &H3
    Public Const RESOURCEDISPLAYTYPE_FILE = &H4
    Public Const RESOURCEDISPLAYTYPE_GROUP = &H5
    Public Const RESOURCEDISPLAYTYPE_NETWORK = &H6
    Public Const RESOURCEDISPLAYTYPE_ROOT = &H7
    Public Const RESOURCEDISPLAYTYPE_SHAREADMIN = &H8
    Public Const RESOURCEDISPLAYTYPE_DIRECTORY = &H9
    Public Const RESOURCEDISPLAYTYPE_TREE = &HA
    Public Const RESOURCEDISPLAYTYPE_NDSCONTAINER = &HB

    Public Const CONNECT_UPDATE_PROFILE = &H1

    '<ErrCodes Connect/DisConnect>
    Public Const ERROR_ACCESS_DENIED As Integer = 5                     '访问被拒绝。
    Public Const ERROR_BAD_DEV_TYPE As Integer = 66                     '网络资源的类型不正确。
    Public Const ERROR_BAD_NET_NAME As Integer = 67                     '找不到网络名称。
    Public Const ERROR_ALREADY_ASSIGNED As Integer = 85                 '本地设备已经被使用了。
    Public Const ERROR_INVALID_PASSWORD As Integer = 86                 'PASSWORD错误。
    Public Const ERROR_BUSY As Integer = 170                            '请求的资源正在被使用。
    Public Const ERROR_BAD_DEVICE As Integer = 1200                     '指定的设备名无效。 
    Public Const ERROR_DEVICE_ALREADY_REMEMBERED As Integer = 1202      '这个本地路径已经被其他的网络链接资源占用。
    Public Const ERROR_NO_NET_OR_BAD_PATH As Integer = 1203             '没有连接网络或路径错误。
    Public Const ERROR_BAD_PROVIDER As Integer = 1204                   '指定的网络名无效。 
    Public Const ERROR_CANNOT_OPEN_PROFILE As Integer = 1205            '网络连接配置文件无法打开。 
    Public Const ERROR_BAD_PROFILE As Integer = 1206                    '网络连接配置文件有损坏。 
    Public Const ERROR_EXTENDED_ERROR As Integer = 1208                 '发生了扩展错误。 
    Public Const ERROR_SESSION_CREDENTIAL_CONFLICT As Integer = 1219    '不允许多数用户同时连接服务器的共享文件夹。
    Public Const ERROR_NO_NETWORK As Integer = 1222                     '没有网络。
    Public Const ERROR_CANCELLED As Integer = 1223                      '操作被用户取消。

    '<ErrCodes DisConnect Only>
    Public Const ERROR_DEVICE_IN_USE As Integer = 2404                  '这个设备上的活动进程正在使用中,无法切断。 
    Public Const ERROR_NOT_CONNECTED As Integer = 2250                  '这个网络无法连接。 
    Public Const ERROR_OPEN_FILES As Integer = 2401                     '网络连接的文件已经被打开。 

    Public Structure NETRESOURCE
        Public dwScope As Integer
        Public dwType As Integer
        Public dwDisplayType As Integer
        Public dwUsage As Integer
        Public lpLocalName As String
        Public lpRemoteName As String
        Public lpComment As String
        Public lpProvider As String
    End Structure

    '连接网络驱动器
    Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer

    '切断网络驱动器
    Public Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Integer, Optional ByVal fForce As Boolean = False) As Boolean

#End Region

#Region "----- メソッド -----"

    '<错误消息>
    Private m_strErrMsg As String


    Public Function Connect(ByVal strServer As String, _
                            ByVal strUser As String, _
                            ByVal strPassword As String) As Boolean

        Dim dwRet As Integer
        Dim objResource As NETRESOURCE

        '********************************
        '* 设定网络资源
        '********************************
        objResource.dwScope = RESOURCE_CONNECTED
        objResource.dwType = RESOURCETYPE_ANY
        objResource.dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC
        objResource.dwUsage = RESOURCEUSAGE_CONNECTABLE
        objResource.lpComment = Nothing
        objResource.lpLocalName = Nothing  
        objResource.lpProvider = Nothing
        objResource.lpRemoteName = strServer

        '*******************
        '* 通过API连接 
        '*******************
        dwRet = WNetAddConnection2(objResource, strPassword, strUser, 0)

        '*******************
        '* 确认连接错误
        '*******************	
	If dwRet <> 0 Then
            Select Case dwRet
                Case ERROR_ACCESS_DENIED
                    m_strErrMsg = "访问被拒绝。"                                
                Case ERROR_BAD_DEV_TYPE
                    m_strErrMsg = "网络资源的类型不正确。
                Case ERROR_BAD_NET_NAME
                    m_strErrMsg = "找不到网络名称。"
                Case ERROR_ALREADY_ASSIGNED
                    m_strErrMsg = "本地设备已经被使用了。"
                Case ERROR_INVALID_PASSWORD
                    m_strErrMsg = "PASSWORD错误。"
                Case ERROR_BUSY
                    m_strErrMsg = "请求的资源正在被使用。"
                Case ERROR_BAD_DEVICE
                    m_strErrMsg = "指定的设备名无效。"
                Case ERROR_DEVICE_ALREADY_REMEMBERED
                    m_strErrMsg = "这个本地路径已经被其他的网络链接资源占用。"
                Case ERROR_NO_NET_OR_BAD_PATH
                    m_strErrMsg = "没有连接网络或路径错误。"
                Case ERROR_BAD_PROVIDER
                    m_strErrMsg = "指定的网络名无效。"
                Case ERROR_CANNOT_OPEN_PROFILE
                    m_strErrMsg = "网络连接配置文件无法打开。"
                Case ERROR_BAD_PROFILE
                    m_strErrMsg = "网络连接配置文件有损坏。"
                Case ERROR_EXTENDED_ERROR
                    m_strErrMsg = "发生了扩展错误。"
                Case ERROR_SESSION_CREDENTIAL_CONFLICT
                    m_strErrMsg = "不允许多数用户同时连接服务器的共享文件夹。"
                Case ERROR_NO_NETWORK
                    m_strErrMsg = "没有网络。"
                Case ERROR_CANCELLED
                    m_strErrMsg = "操作被用户取消。"
                Case Else
                    m_strErrMsg = "发生了不明错误。"
            End Select
            ErrorInfo = m_strErrMsg
            Return False

        End If

        Return True

    End Function


    Public Function Disconnect(ByVal strServer As String) As Boolean

        Dim dwRet As Integer

        '*******************
        '* 通过API切断 
        '*******************
        dwRet = WNetCancelConnection2(strServer, 0, False)

        '*******************
        '* 确认切断错误
        '*******************                 
        If dwRet <> 0 Then
            Select Case dwRet
                Case ERROR_DEVICE_IN_USE
                    m_strErrMsg = "这个设备上的活动进程正在使用中,无法切断。"
                Case ERROR_NOT_CONNECTED
                    m_strErrMsg = "这个网络无法连接。"
                Case ERROR_OPEN_FILES
                    m_strErrMsg = "网络连接的文件已经被打开。"
                Case Else
                    m_strErrMsg = "不明错误。"
            End Select

            Return False
        End If

        Return True

    End Function

    Public Function GetLastError() As String

        Return m_strErrMsg

    End Function

#End Region

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值