digitalmars.D.learn - Reagan: CreateProcess()?
- okibi (6/6) Jul 13 2007 Hey Reagan,
- Regan Heath (45/54) Jul 13 2007 Change seek to:
- okibi (3/72) Jul 13 2007 Well, I can compile and use the code now, but it still makes that darn w...
- Regan Heath (3/4) Jul 13 2007 What are you running? Show me your code which uses Process.
- okibi (3/10) Jul 13 2007 Well, I'm trying to open notepad. I just used your code and replace the ...
- Regan Heath (12/13) Jul 13 2007 The idea was that you do something like:
- Clay Smith (8/19) Jul 16 2007 Here you go:
- okibi (3/27) Jul 24 2007 The globals module is missing. Where can I find it?
- okibi (5/36) Jul 25 2007 Well, I can take out the import and comment out off the directory settin...
- Clay Smith (9/49) Sep 05 2007 The globals file is not necessary, just replace globals.programDir with
- okibi (3/58) Sep 26 2007 Firstly, this only works on Windows, which is ok as system() doesn't ope...
- Regan Heath (4/7) Sep 26 2007 What creation flags is it using? CREATE_NO_WINDOW or DETACHED_PROCESS?
- okibi (3/12) Sep 26 2007 Sorry, I'm not all too familiar with CreateProcess functions.
- okibi (2/18) Sep 26 2007
- okibi (3/24) Sep 26 2007 Apparently it wasn't setup... I glanced over it and thought I saw the CR...
- Regan Heath (8/11) Sep 26 2007 It's working for me with either CREATE_NO_WINDOW or DETACHED_PROCESS or
- okibi (3/20) Sep 26 2007 Well, I was going by what clay had said regarding setting the program to...
- Regan Heath (4/7) Sep 26 2007 My code is "setting the program to cmd.exe", eg.
Hey Reagan, I took your suggestion about getting system() to run without a window by creating a CreateProcess(). I looked at your example on: http://www.digitalmars.com/d/archives/digitalmars/D/29556.html I can't get it to compile! I'm getting an error for expecting type ulong on line 107 in your pipestream.d file. Any ideas? Thanks!
Jul 13 2007
okibi wrote:Hey Reagan, I took your suggestion about getting system() to run without a window by creating a CreateProcess(). I looked at your example on: http://www.digitalmars.com/d/archives/digitalmars/D/29556.html I can't get it to compile! I'm getting an error for expecting type ulong on line 107 in your pipestream.d file. Any ideas?Change seek to: override ulong seek(long offset, SeekPos whence) { assertSeekable(); return 0; } The pipestream isn't seekable so it never returns. After doing that you get a problem with: HANDLE write = INVALID_HANDLE_VALUE; HANDLE read = INVALID_HANDLE_VALUE; just remove the "= INVALID.." it's not really necessary as the constructor always assigns values to these. There are several string/char[] changes, eg. 1) class ProcessException : Exception { version(Windows) { this(string msg) { super(msg ~ ": " ~ sysErrorString(GetLastError())); } } version(linux) { //for some reason getErrno does not link for me? this(string msg) { super(msg ~ ": " ~ std.string.toString(strerror(getErrno()))); } } } 2) string readLine() { return pout.readLine(); } string readError() { return perr.readLine(); } void writeLine(string line) { pin.writeLine(line); } After that I think it should compile, I can't guarantee this code works however ;) Tango has a tango.sys.Pipe and tango.sys.Process which probably do very similar stuff. Regan
Jul 13 2007
Well, I can compile and use the code now, but it still makes that darn window pop up. Is there ANYWAY to keep the black window from popping up? Thanks! Regan Heath Wrote:okibi wrote:Hey Reagan, I took your suggestion about getting system() to run without a window by creating a CreateProcess(). I looked at your example on: http://www.digitalmars.com/d/archives/digitalmars/D/29556.html I can't get it to compile! I'm getting an error for expecting type ulong on line 107 in your pipestream.d file. Any ideas?Change seek to: override ulong seek(long offset, SeekPos whence) { assertSeekable(); return 0; } The pipestream isn't seekable so it never returns. After doing that you get a problem with: HANDLE write = INVALID_HANDLE_VALUE; HANDLE read = INVALID_HANDLE_VALUE; just remove the "= INVALID.." it's not really necessary as the constructor always assigns values to these. There are several string/char[] changes, eg. 1) class ProcessException : Exception { version(Windows) { this(string msg) { super(msg ~ ": " ~ sysErrorString(GetLastError())); } } version(linux) { //for some reason getErrno does not link for me? this(string msg) { super(msg ~ ": " ~ std.string.toString(strerror(getErrno()))); } } } 2) string readLine() { return pout.readLine(); } string readError() { return perr.readLine(); } void writeLine(string line) { pin.writeLine(line); } After that I think it should compile, I can't guarantee this code works however ;) Tango has a tango.sys.Pipe and tango.sys.Process which probably do very similar stuff. Regan
Jul 13 2007
okibi wrote:Well, I can compile and use the code now, but it still makes that darn window pop up. Is there ANYWAY to keep the black window from popping up?What are you running? Show me your code which uses Process. Regan
Jul 13 2007
Well, I'm trying to open notepad. I just used your code and replace the Process command being issued. Thanks! Regan Heath Wrote:okibi wrote:Well, I can compile and use the code now, but it still makes that darn window pop up. Is there ANYWAY to keep the black window from popping up?What are you running? Show me your code which uses Process. Regan
Jul 13 2007
okibi wrote:Well, I'm trying to open notepad. I just used your code and replace the Process command being issued.The idea was that you do something like: Process notepad = new Process(r"c:\windows\notepad.exe"); but when I did that I got a few more char[]/string errors, fixing those gives me an application error for notepad, not sure why (probably it expects certain enviroment variables or something, who knows) So, I don't get the same results as you :( I suggest you look at Tango, try and use the Process class in there. I'm busy this weekend otherwise I'd try and tidy it up and get it working. I might have a look at it next week some time. Till then I'm afraid you're on your own. Regan
Jul 13 2007
okibi wrote:Hey Reagan, I took your suggestion about getting system() to run without a window by creating a CreateProcess(). I looked at your example on: http://www.digitalmars.com/d/archives/digitalmars/D/29556.html I can't get it to compile! I'm getting an error for expecting type ulong on line 107 in your pipestream.d file. Any ideas? Thanks!Here you go: Windows info: http://paste.dprogramming.com/dptyg7pt.php Create Process: http://paste.dprogramming.com/dpsgva0j.php You can use execProcess or my ChildProcesses class. ~ Clay
Jul 16 2007
The globals module is missing. Where can I find it? Thanks! Clay Smith Wrote:okibi wrote:Hey Reagan, I took your suggestion about getting system() to run without a window by creating a CreateProcess(). I looked at your example on: http://www.digitalmars.com/d/archives/digitalmars/D/29556.html I can't get it to compile! I'm getting an error for expecting type ulong on line 107 in your pipestream.d file. Any ideas? Thanks!Here you go: Windows info: http://paste.dprogramming.com/dptyg7pt.php Create Process: http://paste.dprogramming.com/dpsgva0j.php You can use execProcess or my ChildProcesses class. ~ Clay
Jul 24 2007
Well, I can take out the import and comment out off the directory settings and the function works, however I need to give the full path of the command. However, it won't let me run batch scripts through the function at all. And for commands that take arguments, I seem to need to send it through a cmd prompt, which opens a window obviously. The only thing that really helped was the ability to choose whether to wait for the exit code or not. Is the fact that the directory stuff is missing as well as the globals file causing this issue? thanks! okibi Wrote:The globals module is missing. Where can I find it? Thanks! Clay Smith Wrote:okibi wrote:Hey Reagan, I took your suggestion about getting system() to run without a window by creating a CreateProcess(). I looked at your example on: http://www.digitalmars.com/d/archives/digitalmars/D/29556.html I can't get it to compile! I'm getting an error for expecting type ulong on line 107 in your pipestream.d file. Any ideas? Thanks!Here you go: Windows info: http://paste.dprogramming.com/dptyg7pt.php Create Process: http://paste.dprogramming.com/dpsgva0j.php You can use execProcess or my ChildProcesses class. ~ Clay
Jul 25 2007
The globals file is not necessary, just replace globals.programDir with the location of the program directory as a char[]. execProcess(char[] program, char[] args, bool requireExitCode=true) you don't need to run from cmd prompt to set program arguments, just do execProcess("C:\svn\svn.exe", "co svn.dsource.org"); For batch scripts, use C:\systemwhatever\cmd.exe as program name and batch.bat as the argument, that is supposed to work. ~ Clay okibi wrote:Well, I can take out the import and comment out off the directory settings and the function works, however I need to give the full path of the command. However, it won't let me run batch scripts through the function at all. And for commands that take arguments, I seem to need to send it through a cmd prompt, which opens a window obviously. The only thing that really helped was the ability to choose whether to wait for the exit code or not. Is the fact that the directory stuff is missing as well as the globals file causing this issue? thanks! okibi Wrote:The globals module is missing. Where can I find it? Thanks! Clay Smith Wrote:okibi wrote:Hey Reagan, I took your suggestion about getting system() to run without a window by creating a CreateProcess(). I looked at your example on: http://www.digitalmars.com/d/archives/digitalmars/D/29556.html I can't get it to compile! I'm getting an error for expecting type ulong on line 107 in your pipestream.d file. Any ideas? Thanks!Here you go: Windows info: http://paste.dprogramming.com/dptyg7pt.php Create Process: http://paste.dprogramming.com/dpsgva0j.php You can use execProcess or my ChildProcesses class. ~ Clay
Sep 05 2007
Firstly, this only works on Windows, which is ok as system() doesn't open a terminal window on Linux. The problem is that I'm hitting a batch file. When I set the program to point to cmd.exe, it will cause a command prompt window to open to run the command, so back to square one. Clay Smith Wrote:The globals file is not necessary, just replace globals.programDir with the location of the program directory as a char[]. execProcess(char[] program, char[] args, bool requireExitCode=true) you don't need to run from cmd prompt to set program arguments, just do execProcess("C:\svn\svn.exe", "co svn.dsource.org"); For batch scripts, use C:\systemwhatever\cmd.exe as program name and batch.bat as the argument, that is supposed to work. ~ Clay okibi wrote:Well, I can take out the import and comment out off the directory settings and the function works, however I need to give the full path of the command. However, it won't let me run batch scripts through the function at all. And for commands that take arguments, I seem to need to send it through a cmd prompt, which opens a window obviously. The only thing that really helped was the ability to choose whether to wait for the exit code or not. Is the fact that the directory stuff is missing as well as the globals file causing this issue? thanks! okibi Wrote:The globals module is missing. Where can I find it? Thanks! Clay Smith Wrote:okibi wrote:Hey Reagan, I took your suggestion about getting system() to run without a window by creating a CreateProcess(). I looked at your example on: http://www.digitalmars.com/d/archives/digitalmars/D/29556.html I can't get it to compile! I'm getting an error for expecting type ulong on line 107 in your pipestream.d file. Any ideas? Thanks!Here you go: Windows info: http://paste.dprogramming.com/dptyg7pt.php Create Process: http://paste.dprogramming.com/dpsgva0j.php You can use execProcess or my ChildProcesses class. ~ Clay
Sep 26 2007
okibi wrote:Firstly, this only works on Windows, which is ok as system() doesn't open a terminal window on Linux. The problem is that I'm hitting a batch file. When I set the program to point to cmd.exe, it will cause a command prompt window to open to run the command, so back to square one.What creation flags is it using? CREATE_NO_WINDOW or DETACHED_PROCESS? http://msdn2.microsoft.com/en-us/library/ms684863.aspx Regan
Sep 26 2007
Sorry, I'm not all too familiar with CreateProcess functions. From what I can tell, it's doing a CREATE_NEW_CONSOLE. Changing it to CREATE_NO_WINDOW or DETACHED_PROCESS doesn't work. Regan Heath Wrote:okibi wrote:Firstly, this only works on Windows, which is ok as system() doesn't open a terminal window on Linux. The problem is that I'm hitting a batch file. When I set the program to point to cmd.exe, it will cause a command prompt window to open to run the command, so back to square one.What creation flags is it using? CREATE_NO_WINDOW or DETACHED_PROCESS? http://msdn2.microsoft.com/en-us/library/ms684863.aspx Regan
Sep 26 2007
I take that back, CREATE_NO_WINDOW fails (undefined identifier) and DETACHED_PROCESS works, but the window still opens. okibi Wrote:Sorry, I'm not all too familiar with CreateProcess functions. From what I can tell, it's doing a CREATE_NEW_CONSOLE. Changing it to CREATE_NO_WINDOW or DETACHED_PROCESS doesn't work. Regan Heath Wrote:okibi wrote:Firstly, this only works on Windows, which is ok as system() doesn't open a terminal window on Linux. The problem is that I'm hitting a batch file. When I set the program to point to cmd.exe, it will cause a command prompt window to open to run the command, so back to square one.What creation flags is it using? CREATE_NO_WINDOW or DETACHED_PROCESS? http://msdn2.microsoft.com/en-us/library/ms684863.aspx Regan
Sep 26 2007
Apparently it wasn't setup... I glanced over it and thought I saw the CREATE_NO_WINDOW reference. Anyways, it's there now. It's still creating the window while running the batch script. okibi Wrote:I take that back, CREATE_NO_WINDOW fails (undefined identifier) and DETACHED_PROCESS works, but the window still opens. okibi Wrote:Sorry, I'm not all too familiar with CreateProcess functions. From what I can tell, it's doing a CREATE_NEW_CONSOLE. Changing it to CREATE_NO_WINDOW or DETACHED_PROCESS doesn't work. Regan Heath Wrote:okibi wrote:Firstly, this only works on Windows, which is ok as system() doesn't open a terminal window on Linux. The problem is that I'm hitting a batch file. When I set the program to point to cmd.exe, it will cause a command prompt window to open to run the command, so back to square one.What creation flags is it using? CREATE_NO_WINDOW or DETACHED_PROCESS? http://msdn2.microsoft.com/en-us/library/ms684863.aspx Regan
Sep 26 2007
okibi wrote:Apparently it wasn't setup... I glanced over it and thought I saw the CREATE_NO_WINDOW reference. Anyways, it's there now. It's still creating the window while running the batch script.It's working for me with either CREATE_NO_WINDOW or DETACHED_PROCESS or both. Attached is the source (mofified to work with D 2.0). Note that I defined: const CREATE_NO_WINDOW = 0x08000000; in windows.d. Compile with "dmd createprocess windows test" then run "createprocess.exe". Regan
Sep 26 2007
Well, I was going by what clay had said regarding setting the program to CMD.exe and the arguments to the batch script. Simply hitting the batch script works fine, apparently. Thanks for all your help! Regan Heath Wrote:okibi wrote:Apparently it wasn't setup... I glanced over it and thought I saw the CREATE_NO_WINDOW reference. Anyways, it's there now. It's still creating the window while running the batch script.It's working for me with either CREATE_NO_WINDOW or DETACHED_PROCESS or both. Attached is the source (mofified to work with D 2.0). Note that I defined: const CREATE_NO_WINDOW = 0x08000000; in windows.d. Compile with "dmd createprocess windows test" then run "createprocess.exe". Regan
Sep 26 2007
okibi wrote:Well, I was going by what clay had said regarding setting the program to CMD.exe and the arguments to the batch script. Simply hitting the batch script works fine, apparently. Thanks for all your help!My code is "setting the program to cmd.exe", eg. execProcess(`c:\windows\system32\cmd.exe`,`test.bat`) Regan
Sep 26 2007