Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
Delphi 7 Enterprise
|
RunCaptured - nicht in Tmp-Datei sondern MemoryStream?
13. Feb 2006, 10:12
Hi NG.
Delphi 4 (update 3)
Da ich mich die letzte Woche ein wenig mit (Memory-)Streams beschäftigt habe und mich jetzt mittels RunCaptured um die Ausgabe eines Consolenfensters kümmere, frage ich mich ob man bei RunCaptured nicht um die Ausgabe in eine temporäre Datei herumkommt, sondern stattdessen einen Memorystream verwenden kann.
Delphi-Quellcode:
function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;
var
start: TStartupInfo;
procInfo: TProcessInformation;
tmpName: string;
tmp: Windows.THandle;
tmpSec: TSecurityAttributes;
res: TStringList;
return: Cardinal;
begin
Result := False;
try
{ Setze ein Temporäres File }
{ Set a temporary file }
tmpName := 'Test.tmp';
FillChar(tmpSec, SizeOf(tmpSec), #0);
tmpSec.nLength := SizeOf(tmpSec);
tmpSec.bInheritHandle := True;
tmp := Windows.CreateFile(PChar(tmpName),
Generic_Write, File_Share_Write,
@tmpSec, Create_Always, File_Attribute_Normal, 0);
try
FillChar(start, SizeOf(start), #0);
start.cb := SizeOf(start);
start.dwFlags := StartF_UseStdHandles or StartF_UseShowWindow;
start.wShowWindow := SW_Minimize;
start.hStdOutput := tmp;
{ Starte das Programm }
{ Start the program }
if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True,
0, nil, PChar(_dirName), start, procInfo) then
begin
SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);
WaitForSingleObject(procInfo.hProcess, Infinite);
GetExitCodeProcess(procInfo.hProcess, return);
Result := (return = 0);
CloseHandle(procInfo.hThread);
CloseHandle(procInfo.hProcess);
Windows.CloseHandle(tmp);
{ Die Ausgaben hinzufügen }
{ Add the output }
res := TStringList.Create;
try
res.LoadFromFile(tmpName);
Memo1.Lines.AddStrings(res);
finally
res.Free;
end;
Windows.DeleteFile(PChar(tmpName));
end
else
begin
Application.MessageBox(PChar(SysErrorMessage(GetLastError())),
'RunCaptured Error', MB_OK);
end;
except
Windows.CloseHandle(tmp);
Windows.DeleteFile(PChar(tmpName));
raise;
end;
finally
end;
end;
Ich würde in RunCaptured gerne auf Tmp := Windows.Createfile... verzichten und die Ausgabe in einen MemoryStream umleiten. Was spricht dagegen und wie mache ich das?
Gruß
Peter
|
|
Zitat
|