Windows with Delphi Windows API (94) Windows Filesystem (41) Windows Forms (69) Windows Graphics (38)
Exchange Links About this site Links to us 
|
Execute and wait for termination (16 and 32bit applications)
2 comments. Current rating: (1 votes). Leave comments and/ or rate it.
This unit is based upon the well-known and largely used WinExecAndWait function
The former WinexecAndWait function doesn't compile under Delphi 2.0 because the
GetModuleUsage function is no longer supported under Win95.
I have simply updated the previous code so that it works with Delphi 2.0
under Windows 95. With this function you can call Windows-based applications
as well as Dos-based commands. That is 'c:\myapp\app32.exe' as well as
command.com /c del *.bak'.
This new WinexecAndWait32 is intended for Delphi 2.0 Win95 only, it works for me but you use it at your own risk:
 | |  | |
unit WinExc32;
interface
uses Windows;
function WinExecAndWait32(Path: PChar; Visibility: Word;
Timeout : DWORD): integer;
implementation
function WinExecAndWait32(Path: PChar; Visibility: Word;
Timeout : DWORD): integer;
var
WaitResult : integer;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
iResult : integer;
begin
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
with StartupInfo do
begin
cb := SizeOf(TStartupInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
wShowWindow := visibility;
end;
if CreateProcess(nil,path,nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, nil,
StartupInfo, ProcessInfo) then
begin
WaitResult := WaitForSingleObject(ProcessInfo.hProcess, timeout);
result := WaitResult;
end
else
result:=GetLastError;
end;
end.
| |  | |  |
Comments:
|
|
|
|
You must also call CloseHandle on the Process and Thread handles returned on ProcessInfo structure.
|
2008-05-28, 06:25:07 (updated: 2008-05-28, 06:35:17) |
|
|
|
I found the function to be not waiting at all for the current command to finish execution so I added the following, which makes it seem to be working like I expected.
Below 'WaitResult := WaitForSingleObject(ProcessInfo.hProcess, timeout);' add the following
while (WaitResult <> 0) do
begin
Sleep(500);
WaitResult := WaitForSingleObject(ProcessInfo.hProcess, timeout);
end;
Please do let me know whether my logic could result in a major disaster!
A bit later I found this to be only the case when I pass in a Timeout value of zero.
Thanks
|
|