[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]

    {
    > I need run a MS-DOS program at my program, and wait until MS-DOS program
    > finish its work.

    Here is probably the most original way to do this, but works the best.
    It creates a .PIF file and uses that to execute the DOS program.
    Note that the first function "exec" runs a windows program and waits, etc.
    (This is for Delphi 2.x only)

      Function Exec(Path,Params,WorkPath:string; Wait:Boolean; Runmode:integer):boolean;
      {Path       Full path to the executable
       Params     Parameters
       WorkPath   Default directory, '' if same path as executable
       Wait       TRUE if execution of current program waits until new program finishes
       RUNMODE    How the application is executed (0 for default SHOWNORMAL):

          Value                  Meaning
          SW_HIDE                Hides the window and activates another window.
          SW_MAXIMIZE            Maximizes the specified window.
          SW_MINIMIZE            Minimizes the specified window and activates the
                                 next top-level window in the Z order.
          SW_RESTORE             Activates and displays the window. If the window
                                 is minimized or maximized, Windows restores it to
                                 its original size and position. An application
                                 should specify this flag when restoring a minimized
                                 window.
          SW_SHOW                Activates the window and displays it in its current
                                 size and position.
          SW_SHOWDEFAULT         Sets the show state based on the SW_ flag specified
                                 in the STARTUPINFO structure passed to the CreateProcess
                                 function by the program that started the application. An
                                 application should call ShowWindow with this flag to set
                                 the initial show state of its main window.
          SW_SHOWMAXIMIZED       Activates the window and displays it as a maximized window.
          SW_SHOWMINIMIZED       Activates the window and displays it as a minimized window.
          SW_SHOWMINNOACTIVE     Displays the window as a minimized window. The active
                                 window remains active.
          SW_SHOWNA              Displays the window in its current state. The active
                                 window remains active.
          SW_SHOWNOACTIVATE      Displays a window in its most recent size and position.
                                 The active window remains active.
          SW_SHOWNORMAL          Activates and displays a window. If the window is minimized
                                 or maximized, Windows restores it to its original size and
                                 position. An application should specify this flag when
                                 displaying the window for the first time.}

      var name:string;
          handle:integer;
          startUpInfo : TStartupInfo;
          processInfo       : TProcessInformation;
          exeCmd : string;
        begin
          if Runmode=0 then Runmode:=SW_SHOWNORMAL;
          if WorkPath='' then WorkPath:=extractfilepath(path);

          if wait
            then begin  // wait for the process to end...
                   // Check to make{ If the execution file does not exist, then try
                   // adding the path, if that fails then you're stuffed }
                   if not FileExists(path) then begin
                      result := false;
                      exit;
                   end;

                   // Concat in the parameters
                   exeCmd := path + ' ' + params;

                   // Initialise the StartUpInfo record, which handles the creation of

                   // a new main window for a process
                   FillChar(startUpInfo, SizeOf(startUpInfo), Chr(0));
                        StartUpInfo.cb := SizeOf( StartUpInfo );
                        StartUpInfo.dwFlags     := STARTF_USESHOWWINDOW;
                        StartUpInfo.wShowWindow := runmode;

                   // Spawn the process out.
                        if not CreateProcess(

                            nil, PChar(exeCmd), nil, nil, false,
                            CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                            PChar(ExtractFilePath(path)), startUpInfo, processInfo
                          ) then begin
                      result := false;
                   end;

                   // Wait for ze old process to finish.
                   WaitForSingleObject(processInfo.hProcess, INFINITE);
                 end
            else begin
                   handle:=ShellExecute(Application.Handle,'open',pchar(path),pchar(params),
                                        pchar(WorkPath),RunMode);
                 end;
        end;

      Function ExecDOS(Path,Params,WorkPath,Title:String; Wait:Boolean; Minimized:Boolean):Boolean;
      {Just for DOS programs, creates a PIF file then executes it, deleting it afterward.
       Path       Full path to the executable
       Params     Parameters
       WorkPath   Default directory, '' if same path as executable
       Title      Title to display at top of window
       Wait       TRUE if execution of current program waits until new program finishes
       Minimized  TRUE if program is to run minimized.}
      var f:file;
          pifpath:string;
          a:string;
          ierr:integer;
        begin
          if WorkPath='' then WorkPath:=extractfilepath(path);

          // this is a generic PIF image that we've hacked to pieces...settings:
          //   Idle sensitivity set lowest
          //   Default window
          //   Exit on terminate
          //   All memory resources used if needed
          //   Allow screen saver
          //   Not dynamic allocation
          a:=#0#120#84#69#83#84#68#79#126#49#32#32#32#32#32#32#32#32#32#32+
          #32#32#32#32#32#32#32#32#32#32#32#32#128#2#0#0#68#58#92#116#101+
          #115#116#100#111#115#112#114#111#103#114#97#109#116#104#105#110+
          #103#46#101#120#101#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#0#101#58#92#116#101#109#112+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#45#101#120+
          #32#100#58#92#116#101#115#116#32#100#58#92#42#46#42#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#1#0#255#25#80#0#0#7#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#77#73+
          #67#82#79#83#79#70#84#32#80#73#70#69#88#0#135#1#0#0#113#1#87#73+
          #78#68#79#87#83#32#51#56#54#32#51#46#48#0#5#2#157#1#104#0#128+
          #2#0#0#100#0#50#0#255#255#0#0#255#255#0#0#2#0#2#0#159#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#45#101#120#32#100#58#92#116#101+
          #115#116#32#100#58#92#42#46#42#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#87+
          #73#78#68#79#87#83#32#86#77#77#32#52#46#48#0#255#255#27#2#172+
          #1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#80#73#70+
          #77#71#82#46#68#76#76#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#129#0#0#0#0#0#0#0#0#0#0#0#1#0#0#0#5#0#25#0#3#0#200#0+
          #232#3#2#0#10#0#1#0#0#0#0#0#0#0#28#0#0#0#0#0#0#0#8#0#12#0#84#101+
          #114#109#105#110#97#108#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#76#117#99#105#100#97#32#67#111#110#115#111#108#101+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#0#0#0#80#0#25#0#128+
          #2#44#1#0#0#0#0#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0+
          #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#0;
          title:=spaces(title,30);
          move(title[1],a[$02+1],30);

          if length(path)>63 then path:=copy(path,1,63);
          path:=path+#0;
          move(path[1],a[$24+1],length(path));

          if length(params)>63 then params:=copy(params,1,63);
          params:=params+#0;
          move(params[1],a[$a5+1],length(params));
          move(params[1],a[$1c5+1],length(params));

          if length(workpath)>63 then workpath:=copy(workpath,1,63);
          workpath:=workpath+#0;
          move(workpath[1],a[$65+1],length(workpath));

          if minimized
            then a[$1af+1]:=#$12
            else a[$1af+1]:=#$2;

          result:=false; // default unsuccessful
          pifpath:=newfilename(temppath+'00000000.pif',false);
          assignfile(f,pifpath);
          rewrite(f,1);
          ierr:=ioresult;
          blockwrite(f,a[1],length(a),ierr);
          closefile(f);
          if ierr<>length(a) then exit;
          result:=exec(pifpath,'','',wait,0);
          application.processmessages;
          if not wait then delay(1000); // we must wait one second for Windows to read file
          deletefile(pifpath);
        end;

[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]