Tech or Treat! Write an article about your scariest tech disaster to win gadgets!Learn more

x
?
Solved

Errors running program

Posted on 2003-10-22
17
Medium Priority
?
725 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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 

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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

When designing a form there are several BorderStyles to choose from, all of which can be classified as either 'Fixed' or 'Sizable' and I'd guess that 'Fixed Single' or one of the other fixed types is the most popular choice. I assume it's the most p…
I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
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…
Suggested Courses

647 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