Solved

Errors running program

Posted on 2003-10-22
17
723 Views
Last Modified: 2012-05-04
I have a program that writes to files in a share so it creates/deletes the file and creates/deletes a drive map.

When I run the program step by step (using F8) it works fine. When I run the program all at once with no stops it usualy returns errors regarding the networking commands such as: can't delete map or can't read file. Some times (rairly) the program runs fine.

Have you any idea how to solve it?
0
Comment
Question by:visitmeoo
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
17 Comments
 

Author Comment

by:visitmeoo
ID: 9597898
I wan't to add that sometimes I put a msgbox between the commands and that little delay made the program run fine to the end.
0
 
LVL 4

Expert Comment

by:brother7
ID: 9597917
It sounds like a timing problem.  You should check for the existence of a file before you try reading from it, and make sure a drive map exists before trying to delete it.
0
 
LVL 26

Expert Comment

by:EDDYKT
ID: 9598062
Try to put doevents between code
0
MS Dynamics Made Instantly Simpler

Make Your Microsoft Dynamics Investment Count  & Drastically Decrease Training Time by Providing Intuitive Step-By-Step WalkThru Tutorials.

 

Author Comment

by:visitmeoo
ID: 9598416
What are 'doevents' ?
0
 

Author Comment

by:visitmeoo
ID: 9598454
Checking the existince of the file doesn't do me any good.
Already now I can see when the file is created and when it is not. When I run it step by step it's created and when I run it all at once it some times creates it and sometimes doesn't.
0
 

Expert Comment

by:Greenback
ID: 9607793
DoEvents gives control back to Windows so it can process anything that has been queued while waiting for your program to run.

The syntax is:
'code up to here

'DoEvents inserted to allow windows to catch up with processing
Doevents

'continue code.

You could try inserting doevents immediately following any commands that deal with the network (ie. Mapping a drive). This should allow windows to get the process done before your program tries to access the drive.

Hope this helps.
0
 

Author Comment

by:visitmeoo
ID: 9621902
I don't understand exactly how to add the 'doevents' & what they should include. Here is my code, please show me what to add:

Public Sub FindUser(ID As String)
    Dim wshShell
    Set wshShell = CreateObject("WScript.Shell")
   
    'map network drive
    Dim Connect
    Set Connect = CreateObject("WScript.Network")
    Connect.MapNetworkDrive "T:", "\\star\SYSVOL"
    wshShell.CurrentDirectory = "T:\cs.biu.ac.il\scripts"
   
    'create random file name
    Dim fName As String
    Dim objFSO1
   
    Set objFSO1 = CreateObject("Scripting.FileSystemObject")
    fName = NewRandomFileName("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 11)
    Do While objFSO1.FileExists(fName)
        fName = NewRandomFileName("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 11)
    Loop
    fName = fName & ".txt"
   
    'execute search
    Dim myCommand As String
    phoneNo = ID
    myCommand = "cscript search.vbs LDAP://DC=ch,DC=cs,DC=biu,DC=ac,DC=il /C:telephoneNumber=" & phoneNo & " /S:subtree"
    wshShell.Run "cmd.exe /C " & myCommand & " > " & fName, 0
   
    'delete drive mapping
    wshShell.CurrentDirectory = "C:\"
    'MsgBox "stam - doesn't create file without this printing - ask pinchas"
    Connect.RemoveNetworkDrive "T:"
   
    'parsing output file
    wshShell.CurrentDirectory = "\\star\SYSVOL\cs.biu.ac.il\scripts"
    Dim objFSO, objTextFile
    Dim strLinetoParse, begining, arrToken() As String
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTextFile = objFSO.OpenTextFile(fName, 1)
   
    Do While objTextFile.AtEndOfStream <> True
        strLinetoParse = objTextFile.ReadLine
        begining = Mid(strLinetoParse, 1, 7)
        'catches only first instance. If all instances are required remove exit do
        If begining = "ADsPath" Then
            arrToken = Split(strLinetoParse, " ")
            num = arrToken(1)
            'strDN = arrToken(3)
            Results(num - 1) = arrToken(3)
            'Exit Do
        End If
    Loop
   
    'MsgBox "Number of results is: " & num
    objTextFile.Close
    objFSO.DeleteFile (fName)
    Set objFSO = Nothing
    Set objFSO1 = Nothing
    Set wshShell = Nothing
    Set Connect = Nothing
    'path = strDN
    Dim i As Integer
    If num <> "" Then
        For i = 0 To num
            RResults(i) = Results(i)
        Next
    End If
End Sub
0
 

Expert Comment

by:Greenback
ID: 9623024
'Start of code
Public Sub FindUser(ID As String)
    Dim wshShell
    Set wshShell = CreateObject("WScript.Shell")
   
    'map network drive
    Dim Connect
    Set Connect = CreateObject("WScript.Network")
    Connect.MapNetworkDrive "T:", "\\star\SYSVOL"

'DoEvents added to ensure that system completes mapping
   DoEvents

'Set current directory
    wshShell.CurrentDirectory = "T:\cs.biu.ac.il\scripts"
   
    'create random file name
    Dim fName As String
    Dim objFSO1
   
    Set objFSO1 = CreateObject("Scripting.FileSystemObject")
    fName = NewRandomFileName("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 11)
    Do While objFSO1.FileExists(fName)
        fName = NewRandomFileName("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 11)
    Loop
    fName = fName & ".txt"
   
    'execute search
    Dim myCommand As String
    phoneNo = ID
    myCommand = "cscript search.vbs LDAP://DC=ch,DC=cs,DC=biu,DC=ac,DC=il /C:telephoneNumber=" & phoneNo & " /S:subtree"
    wshShell.Run "cmd.exe /C " & myCommand & " > " & fName, 0
'DoEvents added here to ensure complete run/search
DoEvents
   
    'delete drive mapping
    wshShell.CurrentDirectory = "C:\"
    'MsgBox "stam - doesn't create file without this printing - ask pinchas"
    Connect.RemoveNetworkDrive "T:"

'DoEvents added.
DoEvents
   
    'parsing output file
    wshShell.CurrentDirectory = "\\star\SYSVOL\cs.biu.ac.il\scripts"
    Dim objFSO, objTextFile
    Dim strLinetoParse, begining, arrToken() As String
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTextFile = objFSO.OpenTextFile(fName, 1)
   
    Do While objTextFile.AtEndOfStream <> True
        strLinetoParse = objTextFile.ReadLine
        begining = Mid(strLinetoParse, 1, 7)
        'catches only first instance. If all instances are required remove exit do
        If begining = "ADsPath" Then
            arrToken = Split(strLinetoParse, " ")
            num = arrToken(1)
            'strDN = arrToken(3)
            Results(num - 1) = arrToken(3)
            'Exit Do
        End If
    Loop
   
    'MsgBox "Number of results is: " & num
    objTextFile.Close
    objFSO.DeleteFile (fName)
    Set objFSO = Nothing
    Set objFSO1 = Nothing
    Set wshShell = Nothing
    Set Connect = Nothing
    'path = strDN
    Dim i As Integer
    If num <> "" Then
        For i = 0 To num
            RResults(i) = Results(i)
        Next
    End If
End Sub

/*End of code

The number of DoEvents commands might overkill but at least your system will be keeping up with all the mapping changes.

Hope this helps.

*/

0
 

Author Comment

by:visitmeoo
ID: 9625392
Thank you Greenback.
No I understand where the doevents need to come, but I still don't understand what they should contain (how to write them). Can you give me a sample code of what you would put?

Thanks.
0
 

Expert Comment

by:Greenback
ID: 9626973
The DoEvents is just a single word command - DoEvents.

Just type that in and VB will recognize it and go off on it's merry way.

Sorry for not being more clear.
0
 

Author Comment

by:visitmeoo
ID: 9627225
Thanks for the explanation, but it still gets stuck at the line:

Connect.RemoveNetworkDrive "T:"

although I added DoEvents after it.

It gives the error:

Run-time error '-2147022492 (80070964)':
The device is in use by an active process and cannot be disconnected.
0
 

Expert Comment

by:Greenback
ID: 9637323
Try setting a timer to loop just after the connect.removenetworkdrive "T:" statement.
0
 

Expert Comment

by:Greenback
ID: 9637426
Please disregard my last post.

Move the block of code where you set the objects to nothing to before the removenetworkdrive statement. It looks like the object is still pointing to the t: when you try to remove the mapping.
0
 

Author Comment

by:visitmeoo
ID: 9640288
If I set the object to be nothing, I can't delete it (I get an error), probably because the object doesn't exist anymore.
If I set it to nothing, then recreate it and try to delete mapping I'm back to the original problem.
0
 

Author Comment

by:visitmeoo
ID: 9640623
Here is an update:

I found that the problems occurs because the VB program startes running new applications and doesn't wait for them to complete before it continues.
It's a timing issue like some one said.

I found the 'Shell' command which I can use instead of 'wshShell.Run'
This command returns the task ID of the process I'm running and so I can check if the process completed before my application moves on.

My question is: When I have the task ID, how do I check if the process is still alive?

Thanks.
0
 

Accepted Solution

by:
visitmeoo earned 0 total points
ID: 9651299
I found the solution myself. It was quite simple.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wsmthrun.asp

I used the option "bWaitOnReturn" with the "WshShell.Run" command with the value "True". This option indicates whether the first program should wait for the second program to finish executing before continuing to the next statement in the main (first) program.

Thank you everyone for the ideas.
0
 

Expert Comment

by:YensidMod
ID: 9652188
Question is PAQed and points refunded.

YensidMod
Experts Exchange Moderator
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Ready to improve network connectivity? Watch this webinar to learn how SD-WANs and a one-click instant connect tool can boost provisions, deployment, and management of your cloud connection.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I’ve seen a number of people looking for examples of how to access web services from VB6.  I’ve been using a test harness I built in VB6 (using many resources I found online) that I use for small projects to work out how to communicate with web serv…
Background What I'm presenting in this article is the result of 2 conditions in my work area: We have a SQL Server production environment but no development or test environment; andWe have an MS Access front end using tables in SQL Server but we a…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question