【发布时间】:2020-09-09 13:38:55
【问题描述】:
我一直在尝试使用 vb.net 将远程 PC(使用已知凭据并在同一网络上)连接到我的 PC,但遇到以下错误:
托管调试助手“PInvokeStackImbalance”:“对 PInvoke 函数“WindowsApp1!WindowsApp1.Form1::WNetAddConnection2”的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。'
而相同的代码在 Vb6 中已完美执行。
代码:
Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long
Private Structure NETRESOURCE
Dim dwType As Long
Dim lpRemoteName As String
End Structure
Private Const RESOURCETYPE_DISK = &H1
Private Sub ConnectToPC()
Dim networkResource As New NETRESOURCE
Dim lon As Long
With networkResource
.dwType = RESOURCETYPE_DISK
.lpRemoteName = "\\192.168.1.1"
End With
lon = WNetAddConnection2(networkResource, "123", "ADMIN", 0)
End Sub
lon 处抛出异常,代码无法进一步执行。
我是 VB.net 语言的新手。任何帮助都会非常有帮助。
【问题讨论】:
-
Process.Start
net use可能更容易? -
在签名中将
(lpNetResource As NETRESOURCE, ...替换为(By Ref lpNetResource As NETRESOURCE, ...,因为这里的NETRESOURCE是一个结构而不是一个类。此外,将任何Long替换为Integer。 -
对不起,Caius,我没能找到你。 @CaiusJard
-
如果您有新问题,请提出新问题,不要从一个问题开始,然后开始在 cmets 中询问其他问题
-
这个问题所问的原始问题已解决。出于同样的原因,需要一个新问题,我无法开始询问“如何打开我的计算机”,然后将其更改为“如何启动 Visual Studio”,然后是“如何加载我的项目”然后“我如何在 linq 中对列表进行分组” - 在 LINQ 中对列表进行分组与打开我的计算机无关,即使我需要这样做才能对列表进行分组
标签: vb.net vb6 network-programming pinvoke