Chamada a outro programa Esperando ser executado
14/02/2003
0
:?:
Olá pessoal,
Estou com uma duvida, que é a seguinte:
Estou executado um pgm que ao clicar em um determinado botao o mesmo chama uma pgm B, so que o pgm A faz a chamada e executa o restante que esta para ser executado na pilha de execucao, eu gostaria que o pgm A fizesse a chamada e aguardasse ate o pgm B ser finalizado e entao prosseguir com as atividades normais, como se fosse uma chamado a uma funcao ou procedimento.
Grato desde jÁ
EDUARDO
Olá pessoal,
Estou com uma duvida, que é a seguinte:
Estou executado um pgm que ao clicar em um determinado botao o mesmo chama uma pgm B, so que o pgm A faz a chamada e executa o restante que esta para ser executado na pilha de execucao, eu gostaria que o pgm A fizesse a chamada e aguardasse ate o pgm B ser finalizado e entao prosseguir com as atividades normais, como se fosse uma chamado a uma funcao ou procedimento.
Grato desde jÁ
EDUARDO
Anonymous
Curtir tópico
+ 0
Responder
Posts
14/02/2003
Carnette
Para executar um programa e esperar até esse programa finalizar, use a rotina abaixo:
function Executa (Arquivo : String; Estado : Integer) : Integer;
var
Programa : array [0..512] of char;
CurDir : array [0..255] of char;
WorkDir : String;
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
begin
StrPCopy (Programa, Arquivo);
GetDir (0, WorkDir);
StrPCopy (CurDir, WorkDir);
FillChar (StartupInfo, Sizeof (StartupInfo), #0);
StartupInfo.cb := sizeof (StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Estado;
if not CreateProcess (nil, Programa, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
Result := -1
else
begin
WaitForSingleObject (ProcessInfo.hProcess, Infinite);
GetExitCodeProcess (ProcessInfo.hProcess, Result);
end;
end;
Estado é o tipo de janela que aparecerá, que pode ser:
SW_SHOWNORMAL
Janela em modo normal
SW_MAXIMIZE
Janela maximizada
SW_MINIMIZE
Janela minimizada
SW_HIDE
Janela Escondida
function Executa (Arquivo : String; Estado : Integer) : Integer;
var
Programa : array [0..512] of char;
CurDir : array [0..255] of char;
WorkDir : String;
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
begin
StrPCopy (Programa, Arquivo);
GetDir (0, WorkDir);
StrPCopy (CurDir, WorkDir);
FillChar (StartupInfo, Sizeof (StartupInfo), #0);
StartupInfo.cb := sizeof (StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Estado;
if not CreateProcess (nil, Programa, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
Result := -1
else
begin
WaitForSingleObject (ProcessInfo.hProcess, Infinite);
GetExitCodeProcess (ProcessInfo.hProcess, Result);
end;
end;
Estado é o tipo de janela que aparecerá, que pode ser:
SW_SHOWNORMAL
Janela em modo normal
SW_MAXIMIZE
Janela maximizada
SW_MINIMIZE
Janela minimizada
SW_HIDE
Janela Escondida
Responder
15/02/2003
Manoeljr
Oi esta função é muito parecida com a que o amigo postou, mais é um pouco mais refinada previnindo possíveis erros e estouro de pilha.
function ExecutaeEspera(FileName: string; Visibility: integer):Cardinal;
var
zAppName: array[0..512] of char;
zCurDir: array[0..255] of char;
WorkDir: string;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
StrPCopy(zAppName, FileName);
GetDir(0, WorkDir);
StrPCopy(zCurDir, WorkDir);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName,
nil,
nil,
true,
CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then Result := INFINITE {-1} else
begin
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
CloseHandle(ProcessInfo.hProcess); { para prevenir estouro de Pilha }
CloseHandle(ProcessInfo.hThread);
end;
end; :wink:
function ExecutaeEspera(FileName: string; Visibility: integer):Cardinal;
var
zAppName: array[0..512] of char;
zCurDir: array[0..255] of char;
WorkDir: string;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
StrPCopy(zAppName, FileName);
GetDir(0, WorkDir);
StrPCopy(zCurDir, WorkDir);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName,
nil,
nil,
true,
CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then Result := INFINITE {-1} else
begin
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
CloseHandle(ProcessInfo.hProcess); { para prevenir estouro de Pilha }
CloseHandle(ProcessInfo.hThread);
end;
end; :wink:
Responder
Clique aqui para fazer login e interagir na Comunidade :)