sabadao
asked on
Hiding a Dos window
If someone can help me, I need a function in delphi, that execute DOS programs , but doesn't appear the DOS window.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Why do you propose an answer w/o being sure you know the answer??? You cannot just answer the question and go write your code... Maybe someone else wants to answer the question...
//Vik
//Vik
you can use either Winexec() or CreateProcess().
the easiest function to use is Winexec() but its usually for 16bit compatibility.
Any how you can use
WinExec() in following way
procedure RunMyDosApp;
Var
ApplicationToRun :string;
begin
ApplicationToRun := 'C:\Winnt\system32\command .com';{you should put the path and the name of application to run}
if (WinExec(ApplicationToRun, SW_HIDE) < 31) then
dwErrorCode := GetLastError;
end;
feel free to ask ?
the easiest function to use is Winexec() but its usually for 16bit compatibility.
Any how you can use
WinExec() in following way
procedure RunMyDosApp;
Var
ApplicationToRun :string;
begin
ApplicationToRun := 'C:\Winnt\system32\command
if (WinExec(ApplicationToRun,
dwErrorCode := GetLastError;
end;
feel free to ask ?
T A K E A C H I L L P I L !! --->VIK..
ASKER
Thanks, but I have another problem: I have two DOS programs to be executed, and I need to know when one finished to then I can execute the other.
Tanks for the help
Tanks for the help
YOU BETTER TAKE A CHILL PAL...ALRIGHT???
Hello sabadao!
here is a function to use with so it waits until the external app finishes...
-----------
function WinExecAndWait(const FileName, Params: string; WindowState: word): Boolean;
var
{$IFDEF WIN32}
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
{$ELSE}
InstanceID: THandle;
Buff: array[0..255] of char;
{$ENDIF}
begin
{$IFDEF WIN32}
(* enclose the filename in quotes in case it contains spaces *)
CmdLine := Format('"%s" %s', [FileName, Params]);
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WindowState
end;
Result := CreateProcess(nil, pChar(CmdLine), nil, nil, false, (CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS), nil, pChar(ExtractFilePath(File Name)), SUInfo, ProcInfo);
if Result then
WaitForSingleObject(ProcIn fo.hProces s, INFINITE)
{$ELSE}
StrPCopy(Buff, Format('%s %s', [FileName, Params]));
InstanceID := WinExec(Buff, WindowState);
if (InstanceID < 32) then (* a value of less than 32 is bad *)
Result := false
else begin
Result := true;
repeat
Application.ProcessMessage s
until (Application.Terminated or (GetModuleUsage(InstanceID ) = 0))
end
{$ENDIF}
end;
--------
Regards,
Viktor Ivanov
here is a function to use with so it waits until the external app finishes...
-----------
function WinExecAndWait(const FileName, Params: string; WindowState: word): Boolean;
var
{$IFDEF WIN32}
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
{$ELSE}
InstanceID: THandle;
Buff: array[0..255] of char;
{$ENDIF}
begin
{$IFDEF WIN32}
(* enclose the filename in quotes in case it contains spaces *)
CmdLine := Format('"%s" %s', [FileName, Params]);
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WindowState
end;
Result := CreateProcess(nil, pChar(CmdLine), nil, nil, false, (CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS), nil, pChar(ExtractFilePath(File
if Result then
WaitForSingleObject(ProcIn
{$ELSE}
StrPCopy(Buff, Format('%s %s', [FileName, Params]));
InstanceID := WinExec(Buff, WindowState);
if (InstanceID < 32) then (* a value of less than 32 is bad *)
Result := false
else begin
Result := true;
repeat
Application.ProcessMessage
until (Application.Terminated or (GetModuleUsage(InstanceID
end
{$ENDIF}
end;
--------
Regards,
Viktor Ivanov
grow up ..vi
why you are making big deal out of it ...
you need some points let me know
why you are making big deal out of it ...
you need some points let me know
nope....no need of that... I'm sorry of what I said but just wanted to tell you that it's not a good habit... Sorry if I've created a conflict...
Regards,
Viktor Ivanov
Regards,
Viktor Ivanov
Hey guys! Calm down.
Viktor, don't get upset because Kashif doesn't know the mode d'emploi in X-X. He'll learn.
Kashif, sometimes feelings come up when people think they have, or have, better solutions than the one provided, or when cultures clash. Thats just the way it is. Nothing personal, since we don't really know eachother.
The code of honour in X-X is, atleast by my standards: treat anybody the way you want to be treated by them. Join the discussion, don't devastate it. We are all friends here.
Otherwise, keep up the good work!
Now is a good time to puke after listening to all that crap... ;-)
/// John, self-elected prefect of X-X.
Viktor, don't get upset because Kashif doesn't know the mode d'emploi in X-X. He'll learn.
Kashif, sometimes feelings come up when people think they have, or have, better solutions than the one provided, or when cultures clash. Thats just the way it is. Nothing personal, since we don't really know eachother.
The code of honour in X-X is, atleast by my standards: treat anybody the way you want to be treated by them. Join the discussion, don't devastate it. We are all friends here.
Otherwise, keep up the good work!
Now is a good time to puke after listening to all that crap... ;-)
/// John, self-elected prefect of X-X.
viktor i am new to this exchange ..and i have seen people locking my favorite questions but never said any thing ...i thought may be it is the way every one should be helping others ...
may be this explains my point view and apology ..
see yoo all
erajoj --> i really believe in your X-X theory, and apperciate your concern ...thanks
may be this explains my point view and apology ..
see yoo all
erajoj --> i really believe in your X-X theory, and apperciate your concern ...thanks
ASKER
But, this code, when the Dos windows is hide, doesn't no when de application finished to run to run the other application. And how I can destroy de hide window when de application is finished.
same here.,,, 10x John :-)
I believe we are all frineds in here...so i apologies for that...especially to kashif :-)
Regards,
Viktor Ivanov
I believe we are all frineds in here...so i apologies for that...especially to kashif :-)
Regards,
Viktor Ivanov
Hi Sabadao,
Try this out:
sMyDOSCommand := 'dir c:\*.* > c:\dir.txt'; // redirect the dir output to file
// start the command...
// "command.com /c" runs a DOS command and terminates
WinExecAndWait( 'command.com /c' , sMyDOSCommand, SW_HIDE );
// the command is done and the window is gone...
Type "command /?" at the DOS prompt to get a description of the command switches.
/// John
Try this out:
sMyDOSCommand := 'dir c:\*.* > c:\dir.txt'; // redirect the dir output to file
// start the command...
// "command.com /c" runs a DOS command and terminates
WinExecAndWait( 'command.com /c' , sMyDOSCommand, SW_HIDE );
// the command is done and the window is gone...
Type "command /?" at the DOS prompt to get a description of the command switches.
/// John
ASKER
John tanke for the help, but this command :WinExecAndWait( 'command.com /c' , sMyDOSCommand, SW_HIDE ); didn't work only with DIR, CLS, but didn't with executable command.
I am doing something wrong or have another way to run and terminate a dos Program?
I am doing something wrong or have another way to run and terminate a dos Program?
Is something like this what you're looking for?:
WinExec( 'command.exe /c ' + MyDOSCommand, SW_HIDE );
/// John