WNetAddConnection2 call: "PInvokeStackImbalance was detected"

J

John M. Gamble

I'm getting this message in Visual Studio 2005:
PInvokeStackImbalance was detected

Message: A call to PInvoke function
'Refresh!Refresh.Main::WNetAddConnection2' has unbalanced the stack.

This is likely because the managed PInvoke signature does not match
the unmanaged target signature. Check that the calling convention
and parameters of the PInvoke signature match the target unmanaged
signature.

My goal is to connect to a remote filesystem. I don't want to
create a mapping to the filesystem. I just want to connect using the
login name and password that I already have. The web sites that I
googled around at stated that WNetAddConnection2() could be used for
this purpose, particularly

<http://groups.google.com/group/microsoft.public.vb.winapi.networks/browse_t
hread/thread/f61e50f43601670b/005f911e0da84edc?lnk=st&q=LOGON+VPN+VB&rnum=7&
hl=en#>

The code in question is this:


' dwFlags values.
Private Const CONNECT_UPDATE_PROFILE As Long = &H1
Private Const CONNECT_INTERACTIVE As Long = &H8
Private Const CONNECT_PROMPT As Long = &H10

' dwType values.
Private Const RESOURCETYPE_ANY As Long = &H0
Private Const RESOURCETYPE_DISK As Long = &H1
Private Const RESOURCETYPE_PRINT As Long = &H2
Private Const RESOURCETYPE_RESERVED As Long = &H8
Private Const RESOURCETYPE_UNKNOWN As Long = &HFFFFFFFF

' dwScope values.
Private Const RESOURCE_CONNECTED As Long = &H1
Private Const RESOURCE_GLOBALNET As Long = &H2
Private Const RESOURCE_REMEMBERED As Long = &H3
Private Const RESOURCE_RECENT As Long = &H4
Private Const RESOURCE_CONTEXT As Long = &H5

' dwDisplayType values.
Private Const RESOURCEDISPLAYTYPE_DOMAIN As Long = &H1
Private Const RESOURCEDISPLAYTYPE_GENERIC As Long = &H0
Private Const RESOURCEDISPLAYTYPE_SERVER As Long = &H2
Private Const RESOURCEDISPLAYTYPE_SHARE As Long = &H3

Private Const RESOURCEUSAGE_CONNECTABLE As Long = &H1
Private Const SW_SHOWNORMAL As Long = 1

Private Declare Function WNetAddConnection2 Lib "mpr.dll" _
Alias "WNetAddConnection2A" _
(ByVal lpNetResource As NETRESOURCE, _
ByVal lpPassword As String, _
ByVal lpUserName As String, _
ByVal dwFlags As Long) As Long

' The examples used Private Type but Visual Studio complained
' and said that Structure was now preferred.

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


' Function code here.
Dim netstruct As New NETRESOURCE
Dim errcode As Long

With netstruct
.dwScope = RESOURCE_GLOBALNET
.dwType = RESOURCETYPE_ANY
.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE
.dwUsage = RESOURCEUSAGE_CONNECTABLE
.lpRemoteName = backup_base_dir
.lpLocalName = vbNullString
.lpProvider = vbNullString
End With

errcode = WNetAddConnection2(netstruct, _
strLogPass, strLogName, _
CONNECT_INTERACTIVE Or CONNECT_UPDATE_PROFILE)

Am I using contradictory options? Or am I using the wrong function
to begin with?

Thanks,
 
H

Herfried K. Wagner [MVP]

John M. Gamble said:
I'm getting this message in Visual Studio 2005:
PInvokeStackImbalance was detected

Message: A call to PInvoke function
'Refresh!Refresh.Main::WNetAddConnection2' has unbalanced the stack.

[...]

I assume you took the sample from a VB6 projekt or code repository. Note
that VB 2005 is not a technical successor of VB6 and code is generally not
compatible between the two programming languages. Whereas 'Long' was a
32-bit data type in VB6, it's a 64-bit type in VB.NET. Thus you'll have to
modify your declarations, constants, and structures accordingly (this means,
changing 'Long' to 'Integer' or 'Int32', with some exceptions). Note that
some additional modifications of the source code may be necessary in order
to make the code work.
 
J

John M. Gamble

John M. Gamble said:
I'm getting this message in Visual Studio 2005:
PInvokeStackImbalance was detected

Message: A call to PInvoke function
'Refresh!Refresh.Main::WNetAddConnection2' has unbalanced the stack.

[...]

I assume you took the sample from a VB6 projekt or code repository. Note

Hmm. The claim was that it was from a dotnet source, but given the other
change I had to make I am suspicious.
that VB 2005 is not a technical successor of VB6 and code is generally not
compatible between the two programming languages. Whereas 'Long' was a
32-bit data type in VB6, it's a 64-bit type in VB.NET. Thus you'll have to
modify your declarations, constants, and structures accordingly (this means,
changing 'Long' to 'Integer' or 'Int32', with some exceptions). Note that
some additional modifications of the source code may be necessary in order
to make the code work.

Thanks, I'll start with that.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,763
Messages
2,569,562
Members
45,038
Latest member
OrderProperKetocapsules

Latest Threads

Top