16,555
社区成员
发帖
与我相关
我的任务
分享
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
WNET.EnumResource( _
NetResource.ResourceScope.RESOURCE_CONNECTED _
, NetResource.ResourceType.RESOURCETYPE_DISK _
, NetResource.ResourceUsage.RESOURCEUSAGE_ALL _
, Nothing, AddressOf action)
End Sub
Private Sub action(ByVal resoure As NetResource.NETRESOURCE)
With resoure
Console.WriteLine(" {0} : LocalName='{1}' RemoteName='{2}'", .dwDisplayType.ToString(), .lpLocalName, .lpRemoteName)
End With
End Sub
Imports System.Runtime.InteropServices
Public Class NetResource
Private Sub New()
End Sub
Public Const CONNECT_UPDATE_PROFILE As Integer = &H1
Public Enum ResourceScope
''' <summary>
''' 枚举已连接的资源(忽略dwUsage)
''' </summary>
RESOURCE_CONNECTED = 1
''' <summary>
''' 枚举所有资源
''' </summary>
RESOURCE_GLOBALNET
''' <summary>
''' 只枚举永久性连接
''' </summary>
RESOURCE_REMEMBERED
''' <summary>
'''
''' </summary>
RESOURCE_RECENT
''' <summary>
'''
''' </summary>
RESOURCE_CONTEXT
End Enum
Public Enum ResourceType
''' <summary>
''' 枚举所有类型的网络资源
''' </summary>
RESOURCETYPE_ANY
''' <summary>
''' 枚举磁盘资源
''' </summary>
RESOURCETYPE_DISK
''' <summary>
''' 枚举打印资源
''' </summary>
RESOURCETYPE_PRINT
''' <summary>
'''
''' </summary>
RESOURCETYPE_RESERVED
End Enum
Public Enum ResourceUsage
''' <summary>
''' 只枚举那些能够连接的资源
''' </summary>
RESOURCEUSAGE_CONNECTABLE = &H1
''' <summary>
''' 只枚举包含了其他资源的资源
''' </summary>
RESOURCEUSAGE_CONTAINER = &H2
''' <summary>
'''
''' </summary>
RESOURCEUSAGE_NOLOCALDEVICE = &H4
''' <summary>
'''
''' </summary>
RESOURCEUSAGE_SIBLING = &H8
''' <summary>
'''
''' </summary>
RESOURCEUSAGE_ATTACHED = &H10
''' <summary>
'''
''' </summary>
RESOURCEUSAGE_ALL = RESOURCEUSAGE_CONNECTABLE Or RESOURCEUSAGE_CONTAINER Or RESOURCEUSAGE_ATTACHED
End Enum
Public Enum ResourceDisplayType
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_GENERIC
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_DOMAIN
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_SERVERrhf
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_SHARE
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_FILE
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_GROUP
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_NETWORK
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_ROOT
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_SHAREADMIN
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_DIRECTORY
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_TREE
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_NDSCONTAINER
End Enum
<StructLayout(LayoutKind.Sequential)> _
Public Structure NETRESOURCE
Public dwScope As ResourceScope
Public dwType As ResourceType
Public dwDisplayType As ResourceDisplayType
Public dwUsage As ResourceUsage
Public lpLocalName As String
Public lpRemoteName As String
Public lpComment As String
Public lpProvider As String
End Structure
<DllImport("mpr.dll", SetLastError:=True)> _
Public Shared Function WNetOpenEnum _
(ByVal dwScope As ResourceScope, _
ByVal dwType As ResourceType, _
ByVal dwUsage As ResourceUsage, _
<MarshalAs(UnmanagedType.AsAny)> ByVal lpNetResource As Object, _
ByRef lphEnum As IntPtr) As Integer
End Function
<DllImport("mpr.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function WNetCloseEnum _
(ByVal lphEnum As IntPtr) As Integer
End Function
<DllImport("mpr.dll", SetLastError:=True)> _
Public Shared Function WNetEnumResource _
(ByVal hEnum As IntPtr, _
ByRef lpCount As Integer, _
ByVal lpBuffer As IntPtr, _
ByRef lpBufferSize As Integer) As Integer
End Function
End Class
Imports System.Runtime.InteropServices
Public Class WNET
Public Shared Sub EnumResource(ByVal scope As NetResource.ResourceScope, ByVal type As NetResource.ResourceType, ByVal usage As NetResource.ResourceUsage, ByVal source As NetResource.NETRESOURCE, ByVal acton As Action(Of NetResource.NETRESOURCE))
Dim iRet As Integer
Dim ptrHandle As IntPtr = New IntPtr
Try
iRet = NetResource.WNetOpenEnum(scope, type, usage, source, ptrHandle)
If iRet <> 0 Then
Return
End If
Dim entries As Integer
Dim buffer As Integer = &H4000
Dim ptrBuffer As IntPtr = Marshal.AllocHGlobal(buffer)
Dim nextSource As NetResource.NETRESOURCE
Do While True
entries = -1
buffer = &H4000
iRet = NetResource.WNetEnumResource(ptrHandle, entries, ptrBuffer, buffer)
If iRet <> 0 OrElse entries < 1 Then
Return
End If
Dim ptr As Integer = ptrBuffer.ToInt32()
For i As Integer = 0 To entries - 1
nextSource = CType(Marshal.PtrToStructure(New IntPtr(ptr), GetType(NetResource.NETRESOURCE)), NetResource.NETRESOURCE)
EnumResource(scope, type, usage, nextSource, acton)
acton.Invoke(nextSource)
ptr += Marshal.SizeOf(nextSource)
Next i
Loop
Marshal.FreeHGlobal(ptrBuffer)
iRet = NetResource.WNetCloseEnum(ptrHandle)
Catch e As Exception
Console.WriteLine(e.ToString)
End Try
End Sub
End Class
Public Shared Function GetLastDrive() As Char
Dim usedDriveList As New List(Of String)
Dim result As Char = Nothing
For Each info As IO.DriveInfo In IO.DriveInfo.GetDrives
usedDriveList.Add(info.Name)
Next
For Each d As Char In Drives
Dim drive As String = String.Concat(d.ToString, IO.Path.VolumeSeparatorChar, IO.Path.DirectorySeparatorChar)
If Not usedDriveList.Contains(drive) Then
result = d
Exit For
End If
Next
Return result
End Function
Private Shared ReadOnly Drives() As Char = New Char() {"C"c, "D"c, "E"c, "F"c, "G"c, "H"c, "I"c, "J"c, "K"c, "L"c, "M"c, "N"c, "O"c, "P"c, "Q"c, "R"c, "S"c, "T"c, "U"c, "V"c, "W"c, "X"c, "Y"c, "Z"c}
Imports System.Runtime.InteropServices
Namespace LzmTW.uSystem
Friend Class Win32Native
Private Sub New()
End Sub
Public Const CONNECT_UPDATE_PROFILE As Integer = &H1
Public Enum ResourceScope
''' <summary>
''' 枚举已连接的资源(忽略dwUsage)
''' </summary>
RESOURCE_CONNECTED = 1
''' <summary>
''' 枚举所有资源
''' </summary>
RESOURCE_GLOBALNET
''' <summary>
''' 只枚举永久性连接
''' </summary>
RESOURCE_REMEMBERED
''' <summary>
'''
''' </summary>
RESOURCE_RECENT
''' <summary>
'''
''' </summary>
RESOURCE_CONTEXT
End Enum
Public Enum ResourceType
''' <summary>
''' 枚举所有类型的网络资源
''' </summary>
RESOURCETYPE_ANY
''' <summary>
''' 枚举磁盘资源
''' </summary>
RESOURCETYPE_DISK
''' <summary>
''' 枚举打印资源
''' </summary>
RESOURCETYPE_PRINT
''' <summary>
'''
''' </summary>
RESOURCETYPE_RESERVED
End Enum
Public Enum ResourceUsage
''' <summary>
''' 只枚举那些能够连接的资源
''' </summary>
RESOURCEUSAGE_CONNECTABLE = &H1
''' <summary>
''' 只枚举包含了其他资源的资源
''' </summary>
RESOURCEUSAGE_CONTAINER = &H2
''' <summary>
'''
''' </summary>
RESOURCEUSAGE_NOLOCALDEVICE = &H4
''' <summary>
'''
''' </summary>
RESOURCEUSAGE_SIBLING = &H8
''' <summary>
'''
''' </summary>
RESOURCEUSAGE_ATTACHED = &H10
''' <summary>
'''
''' </summary>
RESOURCEUSAGE_ALL = RESOURCEUSAGE_CONNECTABLE Or RESOURCEUSAGE_CONTAINER Or RESOURCEUSAGE_ATTACHED
End Enum
Public Enum ResourceDisplayType
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_GENERIC
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_DOMAIN
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_SERVERrhf
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_SHARE
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_FILE
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_GROUP
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_NETWORK
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_ROOT
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_SHAREADMIN
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_DIRECTORY
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_TREE
''' <summary>
'''
''' </summary>
RESOURCEDISPLAYTYPE_NDSCONTAINER
End Enum
<StructLayout(LayoutKind.Sequential)> _
Public Structure NETRESOURCE
Public dwScope As ResourceScope
Public dwType As ResourceType
Public dwDisplayType As ResourceDisplayType
Public dwUsage As ResourceUsage
Public lpLocalName As String
Public lpRemoteName As String
Public lpComment As String
Public lpProvider As String
End Structure
<DllImport("mpr.dll", SetLastError:=True)> _
Public Shared Function WNetAddConnection2 _
(ByRef lpNetResource As NETRESOURCE, _
ByVal lpPassword As String, _
ByVal lpUserName As String, _
ByVal dwFlags As Integer) As Integer
End Function
<DllImport("mpr.dll", SetLastError:=True)> _
Public Shared Function WNetCancelConnection2 _
(ByVal lpName As String, _
ByVal dwFlags As Integer, _
ByVal fForce As Integer) As Integer
End Function
End Class
End Namespace
Public Shared Function MapDrive(ByRef UNCPath As String, ByRef Drive As String, Optional ByVal user As String = Nothing, Optional ByVal pass As String = Nothing) As Boolean
Dim mDrive As String = GetLastDrive()
Drive = String.Empty
Dim data As New uSystem.Win32Native.NETRESOURCE
With data
.dwScope = LzmTW.uSystem.Win32Native.ResourceScope.RESOURCE_GLOBALNET
.dwType = LzmTW.uSystem.Win32Native.ResourceType.RESOURCETYPE_DISK
.dwUsage = LzmTW.uSystem.Win32Native.ResourceUsage.RESOURCEUSAGE_ALL
.lpLocalName = GetDriveName(CChar(mDrive))
.lpRemoteName = UNCPath
.lpComment = Nothing
.lpProvider = Nothing
End With
Dim result As Integer
result = LzmTW.uSystem.Win32Native.WNetAddConnection2(data, pass, user, 0)
If result = 0 Then
Drive = mDrive
Return True
Else
Drive = GetWin32ErrorMessage()
Return False
End If
End Function
Public Shared Function UnMapDrive(ByVal Driver As Char, ByRef ErrMessage As String) As Boolean
Dim mDrive As String = GetDriveName(Driver)
ErrMessage = String.Empty
Dim result As Integer
result = LzmTW.uSystem.Win32Native.WNetCancelConnection2(mDrive, 0, 1)
If result = 0 Then
Return True
Else
ErrMessage = GetWin32ErrorMessage()
Return False
End If
End Function
Private Shared Function GetDriveName(ByVal driver As Char) As String
If driver < "A"c OrElse driver > "z"c OrElse (driver > "Z"c And driver < "a"c) Then
Throw New Exception("驱动器无效")
End If
Return String.Concat(driver.ToString.ToUpper, IO.Path.VolumeSeparatorChar)
End Function
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
Dim db As LzmTW.Data.Database
db = New LzmTW.Data.DBaseOleDbDatabase("g:\office")
Console.WriteLine(String.Format("DataSource:{0}, Database:{1}", db.DataSource, db.Database))
db = New LzmTW.Data.DBaseOdbcDatabase("g:\office")
Console.WriteLine(String.Format("DataSource:{0}, Database:{1}", db.DataSource, db.Database))
End Sub
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
Dim uri As New Uri("\\fk-a09-05\shared")
Console.WriteLine(uri.IsUnc)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim sql As String = "CREATE TABLE ""{0}\Hello.DBF""(name Character(80), addr Character(30), Salary Numeric(8,2), sex Logical, birthday Date,income Float(10,3))"
Dim path As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Dim shortPath As String = LzmTW.Data.Util.GetShortPathName(path)
Dim result As String = LzmTW.Data.FoxPro.CreateDBaseTable(String.Format(sql, shortPath))
Console.WriteLine(result)
End Sub
<DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function GetShortPathName _
(ByVal longPath As String, _
<MarshalAs(UnmanagedType.LPTStr)> _
ByVal ShortPath As System.Text.StringBuilder, _
<MarshalAs(UnmanagedType.U4)> _
ByVal bufferSize As Integer) As Integer
End Function
Public Shared Function GetShortPathName(ByVal Path As String) As String
Dim b As New System.Text.StringBuilder(1024)
Dim result As String
Dim value As Integer = uSystem.Win32Native.GetShortPathName(Path, b, 1024)
If value <> 0 Then
result = b.ToString()
Else
Throw New Exception("Failed to return a short path")
End If
Return result
End Function
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim sql As String = "CREATE TABLE ""g:\Office\Hello.DBF""(name Character(80), addr Character(30), Salary Numeric(8,2), sex Logical, birthday Date,income Float(10,3))"
Dim result As String = LzmTW.Data.FoxPro.CreateDBaseTable(sql)
Console.WriteLine(result)
End Sub
Namespace LzmTW.uSystem
Public Class ConsoleOut
Public Shared Function Execute(ByVal cmd As String, Optional ByVal waitTime As Integer = 500, Optional ByVal workingDirectory As String = "") As String
Dim result As String = ""
If String.IsNullOrEmpty(cmd) Then Return result
Dim Info As ProcessStartInfo = GetStartInfo(cmd, workingDirectory)
Return Execute(Info, waitTime)
End Function
Public Shared Function Execute(ByVal fileName As String, ByVal args As String, Optional ByVal waitTime As Integer = 500, Optional ByVal workingDirectory As String = "") As String
Dim result As String = ""
If String.IsNullOrEmpty(fileName) Then Return result
Dim Info As ProcessStartInfo = GetStartInfo(fileName, args, workingDirectory)
Return Execute(Info, waitTime)
End Function
Private Shared Function Execute(ByVal info As ProcessStartInfo, ByVal waitTime As Integer) As String
Dim result As String = ""
Dim process As New Process
process.StartInfo = info
Try
If process.Start Then
If waitTime = 0 Then
process.WaitForExit()
Else
process.WaitForExit(waitTime)
End If
result = process.StandardOutput.ReadToEnd
End If
Catch ex As Exception
result = ex.Message
Finally
process.Dispose()
process = Nothing
End Try
Return result
End Function
Private Shared Function GetStartInfo(ByVal cmd As String, ByVal WorkingDirectory As String) As ProcessStartInfo
Return GetStartInfo(System.Environment.GetEnvironmentVariable("ComSpec"), String.Format("/C {0}", cmd), WorkingDirectory)
End Function
Private Shared Function GetStartInfo(ByVal fileName As String, ByVal args As String, ByVal WorkingDirectory As String) As ProcessStartInfo
Dim mStartInfo As New ProcessStartInfo
With mStartInfo
.CreateNoWindow = True
.RedirectStandardOutput = True
.UseShellExecute = False
.WorkingDirectory = WorkingDirectory
.FileName = fileName
.Arguments = args
End With
Return mStartInfo
End Function
End Class
End Namespace
Imports System.Security.Permissions
Imports Microsoft.VisualBasic
Namespace LzmTW.Data
<FileIOPermissionAttribute(SecurityAction.Demand, Unrestricted:=True)> _
Public Class FoxPro
Private gPath As String
'若有错误,则返回错误信息
Public Shared Function CreateDBaseTable(ByVal sqlForCreateTable As String) As String
'临时文件夹X:\LzmTWFox为Fox.exe的工作目录
Dim root As String = IO.Path.GetPathRoot(AppDomain.CurrentDomain.SetupInformation.ApplicationBase)
Dim tmpPath As String = Microsoft.VisualBasic.FileIO.FileSystem.CombinePath(root, "LzmTWFox")
If Not IO.Directory.Exists(tmpPath) Then
IO.Directory.CreateDirectory(tmpPath)
End If
Dim result As String = ""
Dim fox As New FoxPro(tmpPath)
Try
result = fox.CreateTable(sqlForCreateTable)
Catch ex As Exception
result = ex.Message
End Try
Return result
End Function
Private ReadOnly Property Path() As String
Get
Return gPath
End Get
End Property
Private Sub DeletePath()
FileIO.FileSystem.DeleteDirectory(Me.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.DeletePermanently, FileIO.UICancelOption.DoNothing)
End Sub
Private Sub Execute()
If Not IO.File.Exists(Me.GetCurentPathFullName(CreatePrg)) Then Return
uSystem.ConsoleOut.Execute(Me.GetCurentPathFullName(FoxExe), Me.GetCurentPathFullName(CreatePrg), 500, Me.Path)
End Sub
Public Function CreateTable(ByVal createSql As String) As String
Dim result As String = ""
'创建Create.prg文件
FoxPro.CreateFile(Me.GetCurentPathFullName(CreatePrg), FoxPro.CreatePrgString(createSql))
'执行Create.Prg文件
Me.Execute()
'检查错误文件,若有错误,返回错误信息
Dim fileInfo As New IO.FileInfo(Me.GetCurentPathFullName(CreateErr))
If fileInfo.Exists Then
Dim reader As IO.StreamReader = fileInfo.OpenText
result = reader.ReadToEnd
reader.Dispose()
reader = Nothing
End If
'For Each s As String In IO.Directory.GetFiles(Me.Path)
' Console.WriteLine(s)
'Next
'删除临时文件夹X:\LzmTWFox
Me.DeletePath()
Return result
End Function
Sub New(ByVal path As String)
Me.gPath = path
'自资源中释放FOX为FoxRar.Exe文件
Dim Res As System.Resources.ResourceManager = New System.Resources.ResourceManager("Resources", GetType(FoxPro).Assembly)
Dim bytes As Byte() = CType(Res.GetObject(FOX), Byte())
FoxPro.CreateFile(Me.GetCurentPathFullName(FoxRarExe), bytes)
'解压出文件Fox.Exe,Fox.OVL
uSystem.ConsoleOut.Execute(Me.GetCurentPathFullName(FoxRarExe), "", , Me.Path)
'删除FoxRar.Exe文件
IO.File.Delete(Me.GetCurentPathFullName(FoxRarExe))
End Sub
Private ReadOnly FOX As String = "FOX"
Private ReadOnly FoxRarExe As String = "FoxRar.EXE"
Private ReadOnly FoxExe As String = "FOX.EXE"
Private ReadOnly CreatePrg As String = "Create.Prg"
Private ReadOnly CreateErr As String = "Create.Err"
Private Function GetCurentPathFullName(ByVal fileName As String) As String
Return Microsoft.VisualBasic.FileIO.FileSystem.CombinePath(Me.Path, fileName)
End Function
Private Shared Function CreatePrgString(ByVal SqlForCreateTable As String) As String
Dim b As New System.Text.StringBuilder
b.AppendLine("SET SAFETY OFF;")
b.AppendLine("SET DEBUG OFF;")
b.AppendLine("")
b.AppendLine("ON ERROR DO ErrHandle;")
b.AppendLine("")
b.AppendLine(SqlForCreateTable & ";")
b.AppendLine("")
b.AppendLine("QUIT;")
b.AppendLine("")
b.AppendLine("PROCEDURE ErrHandle")
b.AppendLine("QUIT")
Return b.ToString
End Function
Private Shared Sub CreateFile(ByVal fileName As String, ByVal content As Byte())
Dim fileInfo As New IO.FileInfo(fileName)
Dim stream As IO.FileStream = fileInfo.Open(IO.FileMode.Create)
stream.Write(content, 0, content.Length)
stream.Flush()
stream.Dispose()
stream = Nothing
End Sub
Private Shared Sub CreateFile(ByVal fileName As String, ByVal content As String)
Dim Writer As New IO.StreamWriter(fileName, False)
Writer.Write(content)
Writer.Flush()
Writer.Dispose()
Writer = Nothing
End Sub
End Class
End Namespace
SET SAFETY OFF;
SET DEBUG OFF;
ON ERROR DO ErrHandle;
#SQL#
QUIT;
PROCEDURE ErrHandle
QUIT
SET SAFETY OFF;
SET DEBUG OFF;
ON ERROR DO ErrHandle;
CREATE TABLE "G:\Office\Hello.DBF"(name Character(80), addr Character(30), Salary Numeric(8,2), sex Logical, birthday Date,income Float(10,3));
QUIT;
PROCEDURE ErrHandle
QUIT