Kod: Tümünü seç
{$APPTYPE CONSOLE}
uses
SysUtils, Classes, Windows;
procedure ReadOutputFromExternalProcess(const ApplicationName, CommandLine: string; Stream: TStream);
const
PipeSecurityAttributes: TSecurityAttributes = (
nLength: SizeOf(PipeSecurityAttributes);
bInheritHandle: True
);
var
hstdoutr, hstdoutw: THandle;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
lpApplicationName: PChar;
ModfiableCommandLine: string;
Buffer: array [0..4096-1] of Byte;
BytesRead: DWORD;
begin
if ApplicationName='' then begin
lpApplicationName := nil;
end else begin
lpApplicationName := PChar(ApplicationName);
end;
ModfiableCommandLine := CommandLine;
UniqueString(ModfiableCommandLine);
Win32Check(CreatePipe(hstdoutr, hstdoutw, @PipeSecurityAttributes, 0));
Try
Win32Check(SetHandleInformation(hstdoutr, HANDLE_FLAG_INHERIT, 0));//don't inherit read handle of pipe
ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
StartupInfo.wShowWindow := SW_HIDE;
StartupInfo.hStdOutput := hstdoutw;
StartupInfo.hStdError := hstdoutw;
if not CreateProcess(
lpApplicationName,
PChar(ModfiableCommandLine),
nil,
nil,
True,
CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo
) then begin
RaiseLastOSError;
end;
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(hstdoutw);//close the write end of the pipe so that the process is able to terminate
hstdoutw := 0;
while ReadFile(hstdoutr, Buffer, SizeOf(Buffer), BytesRead, nil) and (BytesRead<>0) do begin
Stream.WriteBuffer(Buffer, BytesRead);
end;
Finally
CloseHandle(hstdoutr);
if hstdoutw<>0 then begin
CloseHandle(hstdoutw);
end;
End;
end;
procedure Test;
var
Stream: TFileStream;
begin
Stream := TFileStream.Create('C:\out.txt', fmCreate);
Try
ReadOutputFromExternalProcess('', 'gbak.exe -b -v 176.16.0.2:imalat c:\imalat.fbk -user sysdba -pass ******', Stream);
Finally
Stream.Free;
End;
end;
begin
Test;
end.
Bu şekilde bir kod buldum ama dosya ya yazarken okuyup kontrol edemiyoruz bunu memory stream le yapmayı dendim ama beceremedim. Ustaların ellerinden öper. Eğer kod çalışırken akan bilgiye bir şekilde alabilirsek iyi bir iş olur diye düşünüyorum.gbak:writing constraint PK_MALZEMELER
gbak:writing constraint FK_MALZEMELER_DATA_MALZEMELER
gbak:writing constraint INTEG_32
gbak:writing constraint FK_KONTROLLER_DATA_KONTROLLER
gbak:writing constraint INTEG_13
gbak:writing constraint PK_MALIYETLER_DATA
gbak:writing constraint FK_IMALAT_YERLERI_DT_IMLT_YERI
gbak:writing constraint FK_MALIYETLER_DATA_IMALATLAR
gbak:writing constraint INTEG_23
gbak:writing constraint PK_OPERATORLER
gbak:writing constraint INTEG_24
gbak:writing constraint PK_ISCILIK_DATA
gbak:writing constraint FK_ISCILIK_DATA_IMALATLAR
gbak:writing constraint PK_FIRMALAR
gbak:writing constraint INTEG_16
gbak:writing constraint INTEG_17
gbak:writing constraint INTEG_18
gbak:writing constraint INTEG_19
gbak:writing constraint PK_FIB$FIELDS_INFO
gbak:writing constraint FK_ISCILIK_DATA_OPERATORLER
gbak:writing constraint INTEG_25
gbak:writing constraint INTEG_26
gbak:writing constraint PK_TEZGAHLAR
gbak:writing constraint FK_ISCILIK_DATA_TEZGAHLAR
gbak:writing constraint INTEG_33
gbak:writing constraint PK_KONTROL_HATA
gbak:writing constraint INTEG_31
gbak:writing constraint PK_SQL_TXT
gbak:writing referential constraints
gbak:writing check constraints
gbak:writing SQL roles
gbak:closing file, committing, and finishing. 4088320 bytes written