关于程序访问网络共享文件夹的办法

raynors 2017-09-05 08:36:57
目的是取代 NET USE ....这种会出黑框的办法.

查阅了很多例子,最终锁定 WNetAddConnection2 的方法,其原理是引用mpr.dll 的API

我对此方法了解不深,网上大都是C#的例子(实际上我也没有用C#测试过,直接抄录VB.net 上了.)

如下是程序代码,网上得来,自己修改一些.


Imports System.Runtime.InteropServices
Public Class class_ConnectIPC
'Declare Function WNetAddConnection2A Lib "mpr.dll" Alias _
' "WNetAddConnection2A" (ByVal lpNetResource As NETRESOURCE,
' ByVal lpPassword As String, ByVal lpUserName As String,
'ByVal dwFlags As Integer) As Integer

<DllImport("mpr.dll", CharSet:=CharSet.Auto, EntryPoint:="WNetAddConnection2", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function WNetAddConnection2(lpNetResource As NETRESOURCE, lpPassword As String, lpUserName As String, dwFlags As Integer) As Integer
End Function
'DLL 声明两种方式都用过了。不顶用。

<StructLayout(LayoutKind.Sequential)>
Public Structure NETRESOURCE
Public dwScope As Integer
Public dwDisplayType As Integer
Public dwType As Integer
Public dwUsage As Integer
<MarshalAs(UnmanagedType.LPTStr)>
Public lpLocalName As String
<MarshalAs(UnmanagedType.LPTStr)>
Public lpRemoteName As String
<MarshalAs(UnmanagedType.LPTStr)>
Public lpComment As String
<MarshalAs(UnmanagedType.LPTStr)>
Public lpProvider As String
End Structure

Public Function AddConnect(ByVal MapDriver As String, ByVal UNCPath As String, ByVal username As String, ByVal password As String) As Boolean
Dim retVal As Integer
Dim NetR As new NETRESOURCE
NetR.dwScope = 2
NetR.dwType = 1
NetR.dwDisplayType = 0
NetR.lpLocalName = MapDriver
NetR.lpRemoteName = UNCPath
NetR.lpProvider = vbNull

'在这里出错,系统表示堆栈不对称,应该是参数哪里出了毛病,但是不知道怎么改程序。
retVal = WNetAddConnection2(NetR, password, username, CONNECT_UPDATE_PROFILE)

If retVal = 0 Then
AddConnect = True
Else
AddConnect = False
End If
End Function

End Class

...全文
1138 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
raynors 2017-09-05
  • 打赏
  • 举报
回复
引用 1 楼 homesos 的回复:
<DllImport("mpr.dll", CharSet:=CharSet.Auto, EntryPoint:="WNetAddConnection2", CallingConvention:=CallingConvention.Cdecl)> 是StdCall吧?不是Cdecl。
有时候背时了就真背时了,这破事至少难住了我一下午。然后我发帖,出去撸了一局,回头改了两个地方,就他么成功了。 改动1:的确是是StdCall吧?不是Cdecl。 改动2: Public Structure NETRESOURCE 不能用结构体,用类改为 Public Class NETRESOURCE 改动3:NetR.lpProvider = vbNull 删了。 就成功了。虽然我不知道为什么。。。
homesos 2017-09-05
  • 打赏
  • 举报
回复
<DllImport("mpr.dll", CharSet:=CharSet.Auto, EntryPoint:="WNetAddConnection2", CallingConvention:=CallingConvention.Cdecl)> 是StdCall吧?不是Cdecl。

16,555

社区成员

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

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