CreateProcess - Running an app that runs an app?

Posted on 1997-05-04
Last Modified: 2010-04-06
I hope someone out there has an answer for this. I'm using CreateProcess in an application to Execute another
application (not mine) and this all works fine with the following code, the problem is that the application I
am executing in certain situations (about 75% of times) will itself execute another program, and when it
attempts to do this it just hangs, if I kill my program at this stage the it (the application mine started)
can then continue to run the program it's running without any problems. I've tried changing the creation flags
to CREATE_NEW_CONSOLE but no luck. So does anyone have any ideas, any help would be appreciated! BTW My application must wait until the other program terminates the program it runs and itself, and this must all work in WIN95/NT

Function WinExecAndWait(Path : string; Visibility : word) : word;
    STARTUPINFO : TStartupInfo;
    PROCESS_INFORMATION : TProcessInformation;
    FError : Integer;
    zCmdLine : Array [0..512] of Char;
     STARTUPINFO.wShowWindow := Visibility;
     StrPCopy(zCmdLine, Path);
  // Start the child process.
  if not (CreateProcess( Nil, // No module name (use command line).
      zCmdLine,            // Command line.
      Nil,             // Process handle not inheritable.
      Nil,             // Thread handle not inheritable.
      FALSE,            // Set handle inheritance to FALSE.
      0,                // No creation flags.
      Nil,             // Use parent’s environment block.
      Nil,             // Use parent’s starting directory.
      STARTUPINFO,          // Pointer to STARTUPINFO structure.
      PROCESS_INFORMATION )   // Pointer to PROCESS_INFORMATION structure.
    )   then
        DroneMain.Memo1.Lines.Add('CreateProcess failed: ' + StrPas(zCmdLine))
       DroneMain.Memo1.Lines.Add('Executing: ' + StrPas(zCmdLine));
       // Wait until child process exits.
       WaitForSingleObject( PROCESS_INFORMATION.hProcess, INFINITE );
    // Close process and thread handles.
    CloseHandle( PROCESS_INFORMATION.hProcess );
    CloseHandle( PROCESS_INFORMATION.hThread );
Question by:jsmith050497
  • 4
  • 2

Accepted Solution

gysbert1 earned 100 total points
ID: 1335908
How about using ShellExecute? You can look in the API help, or there is an example in the delphi/demo/doc/filemanex (or something like that) directory. (It is the File Manager example program)
ShellExecute will execute another application and immediately return control to your app. The other app is started as if you loaded it from explorer or whatever. Hope this helps.

Author Comment

ID: 1335909
Edited text of question

Author Comment

ID: 1335910
Sorry, I should have mentioned that I need this to work in Windows 95 and it must also execute the program then wait for it to terminate before continuing. The code I supplied does work if the application run doesn't run another application, but if it does it all just stops and Win95's Task list reports that my program is not responding, when I end my programs task, the other program continues on fine, the strange thing is I get no errors, nothing, I thought maybe it was related to available environment space.

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.


Expert Comment

ID: 1335911
What about using shellexecute, and continually checking the return value (the instance handle of the app) until it no longer  describes a valid application...

Expert Comment

ID: 1335912
I think I answered this on news.... If that don't work out, let me know...


Author Comment

ID: 1335913
Hi Erik,

Yes, no it did'nt work....I've replied with some more info I've found out to news about 5 mins ago, let me know if you have any ideas Re this.


Author Comment

ID: 1335914
Hi Eric/Gysbert,

Okay, I think I've fixed it, here's what I did:

I removed:
WaitForSingleObject( PROCESS_INFORMATION.hProcess,
                  INFINITE );

and replaced it with:
  GetExitCodeProcess(PROCESS_INFORMATION.hProcess, fExitCode);
  while fExitCode = STILL_ACTIVE do
       GetExitCodeProcess(PROCESS_INFORMATION.hProcess, fExitCode);

All seems to operate fine now, just wish I could understand why WaitForSingleObject was causing the problem. Thankyou both for you input on this problem.

Best Regards

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at

708 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

12 Experts available now in Live!

Get 1:1 Help Now