![]() |
RunCaptured - nicht in Tmp-Datei sondern MemoryStream?
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:
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?
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; Gruß Peter |
Re: RunCaptured - nicht in Tmp-Datei sondern MemoryStream?
Moin Peter,
das wird nicht gehen, da ein TMemoryStream kein Handle hat. |
Re: RunCaptured - nicht in Tmp-Datei sondern MemoryStream?
Vielleicht klappt es mit einer Memory-Mapped-File? Denke der Hauptantriebsgrund ist, daß keine File auf der HD landen soll.
|
Re: RunCaptured - nicht in Tmp-Datei sondern MemoryStream?
Danke für die Antwort. Eine Klasse für Memory Mapped File habe ich hier gefunden:
![]() |
Re: RunCaptured - nicht in Tmp-Datei sondern MemoryStream?
Hallo,
ich habe das gleiche Problem. Wie kann ich jetzt so ein Memory-Mapped File in dem gegebenen Code verwenden? Gruß, ManuMF |
Re: RunCaptured - nicht in Tmp-Datei sondern MemoryStream?
Ich habe es dann doch mit einer temporären Datei gemacht, wie es in RunCaptured vorgeschlagen wird.
Gruß Peter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz