Solved

Errors running program

Posted on 2003-10-22
17
718 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
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
 

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
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 

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

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

Introduction While answering a recent question about filtering a custom class collection, I realized that this could be accomplished with very little code by using the ScriptControl (SC) library.  This article will introduce you to the SC library a…
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
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…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

758 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

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now