Shell Path

  1. last week

    Hello,

    I am having a problem with a shell that I cannot figure out. I am trying to communicate with a CLI app via shell like this:

     Dim s As New Shell
      s.Mode = 2
      s.Execute("C:\Users\Administrator\Desktop\PIOSOL~1.10\PIOSOL~2.EXE")

    Now this works fine but when the program loads it gives me an error saying it cannot initialize as it cannot find any of its pref/dat files that are located in the same folder. If I just open the .exe it works fine but when I execute via a shell it will not. I think it has something to do with how shell paths work but not really sure.

    Any help would be greatly appreciated.

  2. Tim J

    Dec 5 Pre-Release Testers, Xojo Pro Dehydrating in AZ

    The shell doesn't inherit any of your normal environment's settings and the tool may be depending on some of those settings. If it's just the tool's associated resources, what happens if you cd into the folder first:

    Dim s As New Shell
      s.Mode = 2
      s.Execute("cd C:\Users\Administrator\Desktop\PIOSOL~1.10\ & .\PIOSOL~2.EXE")
  3. Hi Tim,

    That solved the problem! Thank your very much.

  4. Edited last week

    Hey Tim,

    After I run that command I am still not able to send/receive data from the shell using Mode 2. I put the send routines in a thread with a timer monitoring the DataAvailable/ReadAll event. I have the thread "waiting" with a while/wend and a me.sleep(100) waiting for data from the timer. It does not seem to execute any of the Write commands. Any ideas on what I am doing wrong?

     if app.PioShell <> Nil Then
        
        //run timer
        app.PioData = ""
        PioTimer2.Mode = Timer.ModeMultiple
        
        //send data
        app.PioShell.WriteLine "load_tree "+""""+SolutionsPath+""""
        
       //wait for timer to return data
        While app.PioData = ""
          me.Sleep 100
        wend
    
    end
  5. Tim J

    Dec 5 Pre-Release Testers, Xojo Pro Dehydrating in AZ
    Edited last week

    Two things:

    s.Timeout = -1

    Otherwise your Windows shell times out in 2 seconds.

    and

    YOU must manage the shell mechanism when you create one in that manner. You don't get the DataAvailable and Completed events. Therefore, you must exec the command and then loop until your process is done, outputting info to the user and getting user input.

    You must treat it much like a Console app while you're locked onto the shell's I/O:

    Dim theShell As New Shell
    theShell.Mode = 2
    theShell.Timeout = -1
    theShell.Execute theCommand
    Do
        theShell.Poll
        theMethodToReadProcessOutput()
        theMethodToGetUserInput()
        theMethodToUpdateTheUI()
        App.DoEvents(10)
    Loop Until Not theShell.IsRunning

    If this is done in a Thread, Change App.DoEvents(10) to Me.Sleep(10).

    Without the App.DoEvents() in the loop, even Timers become unresponsive.

or Sign Up to reply!