请精通C#与VB.net的大虾帮忙翻译一下

szch 2003-03-10 09:08:21
翻译完请一并帮助测试一下结果与原版是否一致,我已折腾了两个星期了。
先谢谢了。
using System;
using System.Runtime.InteropServices;

namespace EnumNetPcs
{
[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Auto)]
public class NetResource
{
public UInt32 Scope;
public UInt32 RType;
public UInt32 Display;
public UInt32 Usage;

[MarshalAs(UnmanagedType.LPTStr)]
public string LocalName;
[MarshalAs(UnmanagedType.LPTStr)]
public string RemoteName;
[MarshalAs(UnmanagedType.LPTStr)]
public string Comment;
[MarshalAs(UnmanagedType.LPTStr)]
public string Provider;
}

class Test
{
[DllImport("mpr.dll", CharSet=CharSet.Auto)]
private static extern Int32 WNetOpenEnum
(
UInt32 scope,
UInt32 type,
UInt32 usage,
[In] NetResource rsc,
out IntPtr handle
);

[DllImport("mpr.dll", CharSet=CharSet.Auto)]
private static extern Int32 WNetEnumResource
(
IntPtr handle,
ref Int32 count,
IntPtr buffer,
ref Int32 size
);

[DllImport("mpr.dll", CharSet=CharSet.Auto)]
private static extern Int32 WNetCloseEnum(IntPtr handle);


[STAThread]
static void Main()
{
Int32 result = -1;
IntPtr handle = IntPtr.Zero;

result = WNetOpenEnum(0x00000005, 0x00000000, 0x00000004, null, out handle);
if(result != 0) return;

Int32 entries = 0;
Int32 memory = 16300;
IntPtr buffer = Marshal.AllocHGlobal(memory);
Type type = typeof(NetResource);
Int32 size = Marshal.SizeOf(type);
NetResource rsc = null;
Int32 currect = 0;
while(true)
{
entries = -1;
memory = 16300;
result = WNetEnumResource(handle, ref entries, buffer, ref memory);
if(result >= 259)
{
// Finished.
break;
}
else if(result != 0 || entries < 1)
{
// Failed.
break;
}

currect = (Int32) buffer;
for(Int32 i = 0; i < entries; i++)
{
rsc = (NetResource) Marshal.PtrToStructure((IntPtr) currect, type);
if(rsc != null)
if(rsc.RemoteName != null)
if(rsc.RemoteName.Length > 2)
if(rsc.RemoteName.Substring(0,2).Equals(@"\\"))
Console.WriteLine("RemoteName: {0}", rsc.RemoteName.Substring(2));
currect += size;
}
}

Marshal.FreeHGlobal(buffer);
result = WNetCloseEnum(handle);
Console.Read();
}
}
}
...全文
58 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
confucian 2003-03-10
  • 打赏
  • 举报
回复
Private Function GetNetworkHandle(ByRef nrInit As NETRESOURCE, Optional
ByRef fInit As Boolean = False) As Integer
Dim lngReturn As Integer
Dim lngEnumHandle As Integer
If fInit Then
lngReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
0, Nothing, lngEnumHandle)
Else
lngReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
0, nrInit, lngEnumHandle)
End If
If lngReturn = 0 Then
Return lngEnumHandle
Else
Debug.WriteLine(PointerToString(nrInit.lpRemoteName) & " - " &
lngReturn)

Select Case lngReturn
Case 1208
Dim a As New String(" ", 255)
Dim b As New String(" ", 255)
Dim Buffer As New String(" ", 255)
Debug.WriteLine("An extended error has occurred.
ERROR_EXTENDED_ERROR")
WNetGetLastError(lngReturn, a, 255, b, 255)
Debug.WriteLine(a.Trim)
If b.Trim.Length > 0 Then Debug.WriteLine(b.Trim)
Case Else
Dim Buffer As New String(" ", 255)
Buffer = Space(255)
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, lngReturn,
LANG_NEUTRAL, Buffer, 255, 0)
Debug.WriteLine(Left(Trim(Buffer), Len(Trim(Buffer)) -
3))
End Select
Return 0
End If
End Function

End Module
confucian 2003-03-10
  • 打赏
  • 举报
回复
Module NetEnum

Public fStop As Boolean

Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Short = &H100S
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Short = &H1000S

Private Const LANG_NEUTRAL As Short = &H0S
Private Const SUBLANG_DEFAULT As Short = &H1S

Private Declare Function GetLastError Lib "kernel32" () As Integer
Private Declare Function FormatMessage Lib "kernel32" Alias
"FormatMessageA" (ByVal dwFlags As Integer, ByRef lpSource As Object, ByVal
dwMessageId As Integer, ByVal dwLanguageId As Integer, ByVal lpBuffer As
String, ByVal nSize As Integer, ByRef Arguments As Integer) As Integer
Private Declare Function CopyString2Pointer Lib "kernel32" Alias
"lstrcpyA" (ByVal NewString As Integer, ByVal OldString As String) As
Integer

Private Const GMEM_FIXED As Short = &H0S
Private Const GMEM_ZEROINIT As Short = &H40S
Private Const GPTR As Short = (GMEM_FIXED Or GMEM_ZEROINIT)

Private Const LEVEL_NETWORK As Short = 1
Private Const LEVEL_DOMAIN As Short = 2
Private Const LEVEL_SERVER As Short = 3
Private Const LEVEL_SHARE As Short = 4
Private Const LEVEL_DIRECTORY As Short = 5
Private Const LEVEL_FILE As Short = 6

'RESOURCE ENUMERATION.
Private Const RESOURCE_CONNECTED As Short = &H1S
Private Const RESOURCE_GLOBALNET As Short = &H2S
Private Const RESOURCE_REMEMBERED As Short = &H3S

Private Const RESOURCETYPE_ANY As Short = &H0S
Private Const RESOURCETYPE_DISK As Short = &H1S
Private Const RESOURCETYPE_PRINT As Short = &H2S
Private Const RESOURCETYPE_UNKNOWN As Short = &HFFFFS

Private Const RESOURCEUSAGE_CONNECTABLE As Short = &H1S
Private Const RESOURCEUSAGE_CONTAINER As Short = &H2S
Private Const RESOURCEUSAGE_RESERVED As Integer = &H80000000

Private Const RESOURCEDISPLAYTYPE_GENERIC As Short = &H0S
Private Const RESOURCEDISPLAYTYPE_DOMAIN As Short = &H1S
Private Const RESOURCEDISPLAYTYPE_SERVER As Short = &H2S
Private Const RESOURCEDISPLAYTYPE_SHARE As Short = &H3S
Private Const RESOURCEDISPLAYTYPE_FILE As Short = &H4S
Private Const RESOURCEDISPLAYTYPE_GROUP As Short = &H5S
Private Const RESOURCEDISPLAYTYPE_NETWORK As Short = &H6S
Private Const RESOURCEDISPLAYTYPE_ROOT As Short = &H7S
Private Const RESOURCEDISPLAYTYPE_ADMINSHARE As Short = &H8S
Private Const RESOURCEDISPLAYTYPE_DIRECTORY As Short = &H9S

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
(ByRef hpvDest As NETRESOURCE, ByVal hpvSource As Integer, ByVal cbCopy As
Integer)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As
Integer, ByVal dwBytes As Integer) As Integer
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As
Integer) As Integer
Private Declare Function WNetGetLastError Lib "mpr.dll" Alias
"WNetGetLastErrorA" (ByRef lpError As Integer, ByVal lpErrorBuf As String,
ByVal nErrorBufSize As Integer, ByVal lpNameBuf As String, ByVal
nNameBufSize As Integer) As Integer
Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias
"WNetOpenEnumA" (ByVal dwScope As Integer, ByVal dwType As Integer, ByVal
dwUsage As Integer, ByRef lpNetResource As NETRESOURCE, ByRef lphEnum As
Integer) As Integer
Private Declare Function WNetEnumResource Lib "mpr.dll" Alias
"WNetEnumResourceA" (ByVal hEnum As Integer, ByRef lpcCount As Integer,
ByVal lpBuffer As Integer, ByRef lpBufferSize As Integer) As Integer
Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As
Integer) As Integer
Private Declare Function CopyPointer2String Lib "kernel32" Alias
"lstrcpyA" (ByVal NewString As String, ByVal OldString As Integer) As
Integer

Private Structure NETRESOURCE
Dim dwScope As Integer
Dim dwType As Integer
Dim dwDisplayType As Integer
Dim dwUsage As Integer
Dim lpLocalName As Integer
Dim lpRemoteName As Integer
Dim lpComment As Integer
Dim lpProvider As Integer
End Structure

Sub StartEnum()
Dim lngEnumHandle As Integer
Dim nrInit As NETRESOURCE
lngEnumHandle = GetNetworkHandle(nrInit, True)
If lngEnumHandle = 0 Then
MsgBox("No network.")
Exit Sub
End If
RecurseNetworkLevels(lngEnumHandle)
WNetCloseEnum(lngEnumHandle)
End Sub

Private Sub RecurseNetworkLevels(ByVal lngEnumHandle As Integer)
Dim nrNetInfo() As NETRESOURCE
Dim i As Integer
Dim s As String
Dim stNetRes As NETRESOURCE
Dim cbBuff As Integer = 1023 * Len(stNetRes) ' 32kb
Dim lpBuff As Integer
Dim cCount As Integer = -1 ' Retrieve All
Dim p As Integer ' Pointer
Dim lngReturn As Integer

If fStop Then Exit Sub

Do
lpBuff = GlobalAlloc(GPTR, cbBuff)
lngReturn = WNetEnumResource(lngEnumHandle, cCount, lpBuff,
cbBuff)
If lngReturn = 234 Then ' 234 More data is available.
ERROR_MORE_DATA
If lpBuff <> 0 Then GlobalFree(lpBuff)
cbBuff = cbBuff * 2 ' 64kb, 128kb ...
End If
Loop While lngReturn = 234

If lngReturn = 0 Then
p = lpBuff
ReDim nrNetInfo(cCount - 1)
For i = 1 To cCount
CopyMemory(stNetRes, p, Len(stNetRes))
nrNetInfo(i - 1) = stNetRes
p = p + Len(stNetRes)
Next
Else
Dim Buffer As String = Space(255)
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, lngReturn,
LANG_NEUTRAL, Buffer, 255, 0)
Debug.WriteLine(Buffer.Trim)
If lpBuff <> 0 Then GlobalFree(lpBuff)
Exit Sub
End If

'----------------------------------------------------------------

If cCount <= 0 Then Exit Sub
For i = 0 To cCount - 1

ProcessEntry(nrNetInfo(i))

If RESOURCEUSAGE_CONTAINER = (nrNetInfo(i).dwUsage And
RESOURCEUSAGE_CONTAINER) Then
lngEnumHandle = GetNetworkHandle(nrNetInfo(i))
If lngEnumHandle <> 0 Then
RecurseNetworkLevels(lngEnumHandle)
WNetCloseEnum(lngEnumHandle)
End If
End If
Next

'---------------------------------------------------------------

If lpBuff <> 0 Then GlobalFree(lpBuff)
End Sub

Private Sub ProcessEntry(ByRef nr As NETRESOURCE)

Debug.Write(strType(nr.dwDisplayType))
Debug.Write(" - ")
Debug.Write(PointerToString(nr.lpRemoteName))
Debug.Write(" - ")
Debug.WriteLine(PointerToString(nr.lpComment))

End Sub

Private Function PointerToString(ByRef p As Integer) As String

'The values returned in the NETRESOURCE structures are pointers to
'ANSI strings so they need to be converted to Visual Basic Strings.

Dim s As New String(Chr(0), 255)

CopyPointer2String(s, p)
PointerToString = s.TrimEnd(Chr(0))

End Function

Private Function strType(ByRef lngType As Integer) As String
Select Case lngType
Case RESOURCEDISPLAYTYPE_GENERIC
Return "Generic"
Case RESOURCEDISPLAYTYPE_DOMAIN
Return "Domain"
Case RESOURCEDISPLAYTYPE_SERVER
Return "Server"
Case RESOURCEDISPLAYTYPE_SHARE
Return "Share"
Case RESOURCEDISPLAYTYPE_FILE
Return "File"
Case RESOURCEDISPLAYTYPE_GROUP
Return "Generic"
Case RESOURCEDISPLAYTYPE_NETWORK
Return "Network"
Case RESOURCEDISPLAYTYPE_ROOT
Return "Generic"
Case RESOURCEDISPLAYTYPE_ADMINSHARE
Return "AdminShare"
Case RESOURCEDISPLAYTYPE_DIRECTORY
Return "Directory"
Case Else
Return "Generic"
End Select
End Function

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧