Pegar retorno do gfix pelo delphi?
Saudaçoes,
Gostaria de saber se eh possivel atraves do delphi pegar o retorno de erro resultante da execuçao do gfix. O que gostaria de fazer eh executar o gfix antes de realizar o backup do banco e caso algum problema seja detectado avisar o usuario.
Obs: Não posso usar componentes tipo IBValidationService
Grato
Gostaria de saber se eh possivel atraves do delphi pegar o retorno de erro resultante da execuçao do gfix. O que gostaria de fazer eh executar o gfix antes de realizar o backup do banco e caso algum problema seja detectado avisar o usuario.
Obs: Não posso usar componentes tipo IBValidationService
Grato
Adriano Dolce
Curtidas 0
Respostas
Adriano Dolce
14/07/2011
Saudaçoes,
Gostaria de saber se eh possivel atraves do delphi pegar o retorno de erro resultante da execuçao do gfix. O que gostaria de fazer eh executar o gfix antes de realizar o backup do banco e caso algum problema seja detectado avisar o usuario.
Obs: Não posso usar componentes tipo IBValidationService
Grato
Sobe
Gostaria de saber se eh possivel atraves do delphi pegar o retorno de erro resultante da execuçao do gfix. O que gostaria de fazer eh executar o gfix antes de realizar o backup do banco e caso algum problema seja detectado avisar o usuario.
Obs: Não posso usar componentes tipo IBValidationService
Grato
GOSTEI 0
Deivison Melo
14/07/2011
O que você precisa é pegar AS informações que são exibidas no prompt de comando (DOS).
Achei essa função na net, testa com ela!!
Function SaidaDoCMD(Comando:String):String;
var
Security: TSecurityAttributes;
ReadPipe,WritePipe:THandle;
Start:TStartUpInfo;
ProcessInfo:TProcessInformation;
BytesReadWord;
Buffer:PChar;
begin
Security.nLength:=SizeOf(TSecurityAttributes);
Security.bInheritHandle:=True;
Security.lpSecurityDescriptor:=nil;
if CreatePipe(ReadPipe,WritePipe,@Security,0)then
try
GetMem(Buffer,2400);
FillChar(Buffer^,2400,0);
FillChar(start,SizeOf(start),#0);
start.cb:=SizeOf(start);
start.dwFlags:=257;
start.hStdOutput:=WritePipe;
if CreateProcess(nil,PChar(Comando),@Security,@Security,True,32,nil,nil,start,ProcessInfo)then begin
repeat
ReadFile(ReadPipe,Buffer[0],2400,BytesRead,nil);
Result:=Result+String(Buffer);
until BytesRead<2400;
end;
FreeMem(Buffer);
finally
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
Exemplo de uso: ServerSocket1.Socket.SendText(SaidaDoCMD('netstat -abn')); PS. Os créditos dessa função não são meus!!!!
var
Security: TSecurityAttributes;
ReadPipe,WritePipe:THandle;
Start:TStartUpInfo;
ProcessInfo:TProcessInformation;
BytesReadWord;
Buffer:PChar;
begin
Security.nLength:=SizeOf(TSecurityAttributes);
Security.bInheritHandle:=True;
Security.lpSecurityDescriptor:=nil;
if CreatePipe(ReadPipe,WritePipe,@Security,0)then
try
GetMem(Buffer,2400);
FillChar(Buffer^,2400,0);
FillChar(start,SizeOf(start),#0);
start.cb:=SizeOf(start);
start.dwFlags:=257;
start.hStdOutput:=WritePipe;
if CreateProcess(nil,PChar(Comando),@Security,@Security,True,32,nil,nil,start,ProcessInfo)then begin
repeat
ReadFile(ReadPipe,Buffer[0],2400,BytesRead,nil);
Result:=Result+String(Buffer);
until BytesRead<2400;
end;
FreeMem(Buffer);
finally
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
Exemplo de uso: ServerSocket1.Socket.SendText(SaidaDoCMD('netstat -abn')); PS. Os créditos dessa função não são meus!!!!
GOSTEI 0
Adriano Dolce
14/07/2011
O que você precisa é pegar AS informações que são exibidas no prompt de comando (DOS).
Achei essa função na net, testa com ela!!
Function SaidaDoCMD(Comando:String):String;
var
Security: TSecurityAttributes;
ReadPipe,WritePipe:THandle;
Start:TStartUpInfo;
ProcessInfo:TProcessInformation;
BytesReadWord;
Buffer:PChar;
begin
Security.nLength:=SizeOf(TSecurityAttributes);
Security.bInheritHandle:=True;
Security.lpSecurityDescriptor:=nil;
if CreatePipe(ReadPipe,WritePipe,@Security,0)then
try
GetMem(Buffer,2400);
FillChar(Buffer^,2400,0);
FillChar(start,SizeOf(start),#0);
start.cb:=SizeOf(start);
start.dwFlags:=257;
start.hStdOutput:=WritePipe;
if CreateProcess(nil,PChar(Comando),@Security,@Security,True,32,nil,nil,start,ProcessInfo)then begin
repeat
ReadFile(ReadPipe,Buffer[0],2400,BytesRead,nil);
Result:=Result+String(Buffer);
until BytesRead<2400;
end;
FreeMem(Buffer);
finally
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
Exemplo de uso: ServerSocket1.Socket.SendText(SaidaDoCMD('netstat -abn')); PS. Os créditos dessa função não são meus!!!!
Muito obrigado amigo, mais não deu certo não, travou aqui e não executou.var
Security: TSecurityAttributes;
ReadPipe,WritePipe:THandle;
Start:TStartUpInfo;
ProcessInfo:TProcessInformation;
BytesReadWord;
Buffer:PChar;
begin
Security.nLength:=SizeOf(TSecurityAttributes);
Security.bInheritHandle:=True;
Security.lpSecurityDescriptor:=nil;
if CreatePipe(ReadPipe,WritePipe,@Security,0)then
try
GetMem(Buffer,2400);
FillChar(Buffer^,2400,0);
FillChar(start,SizeOf(start),#0);
start.cb:=SizeOf(start);
start.dwFlags:=257;
start.hStdOutput:=WritePipe;
if CreateProcess(nil,PChar(Comando),@Security,@Security,True,32,nil,nil,start,ProcessInfo)then begin
repeat
ReadFile(ReadPipe,Buffer[0],2400,BytesRead,nil);
Result:=Result+String(Buffer);
until BytesRead<2400;
end;
FreeMem(Buffer);
finally
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
Exemplo de uso: ServerSocket1.Socket.SendText(SaidaDoCMD('netstat -abn')); PS. Os créditos dessa função não são meus!!!!
Para que quiser testar mudar esta linha aqui BytesReadWord; por BytesRead: DWord;
GOSTEI 0
Euler
14/07/2011
Galera, o código acima realmente não funciona se você executar direto.
Mas se se você executar debugando ele funciona. Dica.
Coloca um Sleep(1000) pra dar um tempo de um segundo pra ele pegar o retorno.
Mas se se você executar debugando ele funciona. Dica.
Coloca um Sleep(1000) pra dar um tempo de um segundo pra ele pegar o retorno.
GOSTEI 0