Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

Hello all. I hope that you can help me.

 

My application uses a tabbed form with around 200 controls in total.

 

It's basically an interface that displays information about UserID's in our NT Domain (or it will do soon..!).

 

The problem that I have is this.

A user is required to enter a UserID into an Input box which is fired from a menu.

 

Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem4.Click

       Dim strPaycodeSearch As String
       Dim myUser As LANUser

       myUser = New LANUser(Me.lstbxUserShortcutsCurrentShortcuts, _
           Me.lstbxUsersGroupsUsersGroups)

       'Ask user for a user id
       strPaycodeSearch = InputBox("Please enter users paycode.", _
           "Enter paycode")

 

After some resetting of text boxes and checkoxes, the code then goes away and invokes a method in the LANUser class that uses the NetUserGetInfo API to return information into a USER_INFO_3 structure

 

Function GetUserDetails(ByRef UserID As String) As Boolean

       Dim UI3 As New USER_INFO_3()
       Dim Server As String
       Dim loopCount As Integer
       Dim lRet As Integer = -1
       Dim size As Integer = Marshal.SizeOf(UI3)
       Dim lpBuf As IntPtr = Marshal.AllocHGlobal(size)
       Dim Network As New Network()
       Const Level As Integer = 3

       _myShortcutBox.Items.Clear()

       Marshal.StructureToPtr(UI3, lpBuf, True)

       Server = Network.PDC & vbNullChar
       Me.UserID = UserID & vbNullChar

       lRet = NetUserGetInfo(Server, Me.UserID, Level, lpBuf)

       If lRet = NERR_SUCCESS Then

           UI3 = CType(Marshal.PtrToStructure(lpBuf, _
                    GetType(USER_INFO_3)), USER_INFO_3)

           Me.UserID = UI3.usri3_name
           Me.UserName = UI3.usri3_full_name
           Me.HomeServer = Microsoft.VisualBasic.Left(UI3.usri3_home_dir, 10)
           Me.HomeDirectory = UI3.usri3_home_dir
           Me.ProfilePath = UI3.usri3_profile
           Me.Description = UI3.usri3_comment
           Me.LogonScript = UI3.usri3_script_path
           Me.HomeDirectoryDrive = UI3.usri3_home_dir_drive
           Me.AccountFlags = UI3.usri3_flags

           NetApiBufferFree(lpBuf)
           Return True
       Else
           MessageBox.Show("User is not known to the PDC.")
           NetApiBufferFree(lpBuf)
           Return False
       End If

   End Function

 

If the Function succeeds, the form is updated with values taken from the LANUser proprties.

 

If myUser.GetUserDetails(strPaycodeSearch) = True Then

           Me.txtbxUserManagerDescription.Text = myUser.Description
           Me.txtbxUsersProfileProfilePath.Text = myUser.ProfilePath
           Me.txtbxUsersProfileLogonScript.Text = myUser.LogonScript
           Me.lblUserNamePaycode_ProfileTab.Text = myUser.UserID & " - " & _
               myUser.UserName
           Me.lblUserNamePaycode_UserTab.Text = myUser.UserID & " - " & _
               myUser.UserName
           Me.txtbxMoveUserHomeServer.Text = myUser.HomeServer
           Me.txtbxUsersHomeDirectoryConnectTo.Text = myUser.HomeDirectory
           Me.cmbbxUsersHomeDirectoryDrive.Text = myUser.HomeDirectoryDrive

           'Test to see if there is a valid profile on the users 
           'home server.

           If Directory.Exists(myUser.ProfilePath) = True Then
               myUser.ProfileExists = True
           Else
               myUser.ProfileExists = False
               MessageBox.Show("There does not appear to be a valid profile " & _
                   "on the server for this user.", "Profile Does Not Exist", _
                   MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
           End If

           'If a profile exists, retrieve the users shortcuts.

           If myUser.ProfileExists = True Then
               myUser.GetShortcuts(myUser.ProfilePath & "\Start Menu\", False)
               myUser.GetShortcuts(myUser.ProfilePath & "\Start Menu\Programs\Business\", True)
           End If

           'Get Account flags and set the Checkboxes on the forms
           Select Case myUser.AccountFlags
               Case 66049
                   myUser.PasswordNeverExpires = True
                   Me.chkbxUserManager_PasswordNeverExpires.Checked = True
               Case 577
                   myUser.PasswordCannotChange = True
                   Me.chkbxUserManager_UserCannotChangePassword.Checked = True
               Case 515
                   myUser.AccountDisabled = True
                   Me.chkbxUserManager_AccountDisabled.Checked = True
               Case 66113
                   myUser.PasswordCannotChange = True
                   myUser.PasswordNeverExpires = True
                   Me.chkbxUserManager_UserCannotChangePassword.Checked = True
                   Me.chkbxUserManager_PasswordNeverExpires.Checked = True
               Case 579
                   myUser.PasswordCannotChange = True
                   myUser.AccountDisabled = True
                   Me.chkbxUserManager_UserCannotChangePassword.Checked = True
                   Me.chkbxUserManager_AccountDisabled.Checked = True
               Case 66115
                   myUser.PasswordCannotChange = True
                   myUser.PasswordNeverExpires = True
                   myUser.AccountDisabled = True
                   Me.chkbxUserManager_UserCannotChangePassword.Checked = True
                   Me.chkbxUserManager_PasswordNeverExpires.Checked = True
                   Me.chkbxUserManager_AccountDisabled.Checked = True
               Case 66051
                   myUser.PasswordNeverExpires = True
                   myUser.AccountDisabled = True
                   Me.chkbxUserManager_PasswordNeverExpires.Checked = True
                   Me.chkbxUserManager_AccountDisabled.Checked = True
               Case 529
                   myUser.AccountLocked = True
                   Me.chkbxUserManager_AccountLockedOut.Checked = True
           End Select
End If

 

After this, the users NT Groups are acquired and populated into a listbox.

 

Public Function GetGroups(ByVal UserID As String) As Boolean
       Dim GI0 As New GROUP_USERS_INFO_0()
       Dim Level As Integer = 0
       Dim Network As New Network()
       Dim Server As String = Network.GetPDC & vbNullChar
       Dim i As Integer
       Dim lRet As Integer = -1
       Dim size As Integer = Marshal.SizeOf(GI0)
       Dim lpBuf As IntPtr = Marshal.AllocHGlobal(size)
       Dim EntriesRead As Integer
       Dim TotalEntries As Integer
       Dim lpBuf3 As IntPtr

       UserID = UserID & vbNullChar

       Marshal.StructureToPtr(GI0, lpBuf, True)

       lRet = NetUserGetGroups(Server, UserID, Level, lpBuf, -1, _
           EntriesRead, TotalEntries)

       If lRet = NERR_SUCCESS Then
           Dim nSize As Integer = Marshal.SizeOf(GI0)
           Dim lpBuf2 As IntPtr

           For i = 0 To EntriesRead - 1
               lpBuf2 = New IntPtr(lpBuf.ToInt32 + i * nSize)
               GI0 = CType(Marshal.PtrToStructure(lpBuf2, _
                         GetType(GROUP_USERS_INFO_0)), _
                         GROUP_USERS_INFO_0)

               _myGroupsbox.Items.Add(GI0.grui0_name)
           Next
           NetApiBufferFree(lpBuf)
           Return True
       Else
           NetApiBufferFree(lpBuf)
           Return False
       End If


   End Function

 

And that's it for now.

However, when I try to click on the menu again to pull up another users details, my application hangs and sometimes errors with a StackOverflowException.

 

This exception hits at the point where the Inputbox is supposed to be displayed. The new LANUser code is fired.

 

Apologies for the length of this post, but if anybody can tell me why this is happening, I'd be grateful.

  • *Gurus*
Posted
A stack overflow exception is pretty much only thrown when your code is recursing on itself infinitely. Check for any actions in your code which could fire an event that runs the same code, this will be the problem 99% of the time.

MVP, Visual Developer - .NET

 

Now you see why evil will always triumph - because good is dumb.

 

My free .NET Windows Forms Controls and Articles

Posted

Thanks Divil.

 

I think I may have narrowed this down a bit.

When I step through my code, the Click Event for my MenuItem sits on top of the stack.

 

When the End Sub command is processed in the Click Event, the process still sits on top of the stack. I was under the impression that when a method/process is finished with, it turns grey in the stack window.

 

When I click the menu item again, obviously the Click event from the previous instance is still active.

 

Any ideas why the Click event doesn't finish properly after the End Sub is processd??!!

  • *Experts*
Posted

When your program gets the stack overflow, press "Break" then open the Call Stack window (Debug->Windows->Call Stack). You can see all the code executing up to the current error. Lines in black are your code, lines in light grey are .NET code (from DLLs and such). Look for the black lines. Chances are you'll see the same two or three functions/events firing over and over, calling each othe recursively.

 

-Nerseus

"I want to stand as close to the edge as I can without going over. Out on the edge you see all the kinds of things you can't see from the center." - Kurt Vonnegut

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...