Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi RunCaptured - nicht in Tmp-Datei sondern MemoryStream? (https://www.delphipraxis.net/63033-runcaptured-nicht-tmp-datei-sondern-memorystream.html)

PASST 13. Feb 2006 09:12


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:
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

Christian Seehase 13. Feb 2006 18:16

Re: RunCaptured - nicht in Tmp-Datei sondern MemoryStream?
 
Moin Peter,

das wird nicht gehen, da ein TMemoryStream kein Handle hat.

Vjay 14. Feb 2006 14:34

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.

PASST 15. Feb 2006 07:37

Re: RunCaptured - nicht in Tmp-Datei sondern MemoryStream?
 
Danke für die Antwort. Eine Klasse für Memory Mapped File habe ich hier gefunden:
Memory Mapped File für Delphi

ManuMF 17. Mär 2006 08:42

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

PASST 20. Mär 2006 08:32

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