AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

Ein Thema von EinsteinXXL · begonnen am 19. Aug 2015 · letzter Beitrag vom 20. Aug 2015
Antwort Antwort
EinsteinXXL

Registriert seit: 18. Aug 2015
8 Beiträge
 
#1

CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

  Alt 19. Aug 2015, 17:51
Delphi-Version: XE8
Hallo,

ich möchte die windows konsole aufrufen und die ausgabe in einer memo ausgeben. Das funktioniert auch ohne Probleme, aber die Umlaute werden nicht richtig dargestellt.

Folgenden Code habe ich dafür aus dem Forum verwendet.

http://www.delphipraxis.net/169697-c...t-ausgabe.html

Hat jemand einen Tip für mich?

die Ausgabe sieht dann so aus.

Code:
Datentr„ger in Laufwerk C: ist....

Geändert von EinsteinXXL (19. Aug 2015 um 18:58 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

  Alt 19. Aug 2015, 18:04
Öffne ein CMD-Fenster,
Eigenschaften aufrufen,
Schriftart Lucida Console wählen,
man kann auch die Farben ändern.

Im Memo Schriftart MSLineDraw wählen.
Miniaturansicht angehängter Grafiken
cmd_eigenschaften.jpg   memo_mslinedraw.jpg   memo_mslinedraw-1.jpg  

Geändert von hathor (19. Aug 2015 um 19:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#3

AW: CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

  Alt 19. Aug 2015, 18:09
Stichwort ASCII- bzw. ANSI-Codierung.

@hathor: Was hat das mit der Frage zu tun?

MfG Dalai
  Mit Zitat antworten Zitat
EinsteinXXL

Registriert seit: 18. Aug 2015
8 Beiträge
 
#4

AW: CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

  Alt 19. Aug 2015, 18:20
@dalai

Das ist mir schon klar, aber ich weiß gerade nicht wo ich ansetzen soll. Bin leider noch ein ziemlicher Frischling in der Programmierung.

Ich habe schon versucht den "buffer" mit OemToAnsi(buffer, buffer) zu konvertieren, aber da spuckt der Compiler leider einen Fehler aus.

Code:
´[dcc32 Error] IBDMain.pas(212): E2010 Incompatible types: 'PAnsiChar' and 'array[0..255] of PWideChar'
EDIT:

Habe nun ne Möglichkeit gefunden. Es lebe google!!!

Hier die Lösung:

Code:
OEMToAnsiBuff(Stream.Memory, Stream.Memory, Stream.Size);
Bevor man also den Stream in die StringList kopiert, kann man mit hilfe von OEMToAnsiBuff den stream zu ANSI konvertieren.

Hier noch die Webseite durch welche ich auf die Lösung gekommen bin. (ich hoffe das ist erlaubt)

http://www.swissdelphicenter.ch/torr...ode.php?id=723

Geändert von EinsteinXXL (19. Aug 2015 um 19:42 Uhr) Grund: Problem gelöst!!!
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

AW: CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

  Alt 19. Aug 2015, 21:36
Bevor ich frage, wo Du das hinein kopierst, schreibe ich gleich die ganze
Funktion:
Delphi-Quellcode:
function GetConsoleOutput(Command : string;
                          Output, Errors : TStringList) : Boolean;
var
  Buffer : array[0..255] of Char;
  CreationFlags : DWORD;
  NumberOfBytesRead : DWORD;
  PipeErrorsRead : THandle;
  PipeErrorsWrite : THandle;
  PipeOutputRead : THandle;
  PipeOutputWrite : THandle;
  ProcessInfo : TProcessInformation;
  SecurityAttr : TSecurityAttributes;
  StartupInfo : TStartupInfo;
  Stream : TMemoryStream;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(TSecurityAttributes);
  SecurityAttr.bInheritHandle := True;
  SecurityAttr.lpSecurityDescriptor := nil;

  //Pipes erzeugen
  CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
  CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);

  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := SW_HIDE;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  CreationFlags := CREATE_DEFAULT_ERROR_MODE or
                   CREATE_NEW_CONSOLE or
                   NORMAL_PRIORITY_CLASS;

  // Folgende Zeile ist nur für Delphi ab 2009 erforderlich:
  UniqueString(Command);

  if CreateProcess(nil,
                   PChar(Command),
                   nil,
                   nil,
                   True,
                   CreationFlags,
                   nil,
                   nil,
                   StartupInfo,
                   ProcessInfo) then
  begin
    Result := True;
    //Write-Pipes schließen
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsWrite);

    //Ausgabe Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil) do
      begin
         Stream.Write(Buffer, NumberOfBytesRead);
      end;
      OEMToAnsiBuff(Stream.Memory, Stream.Memory, Stream.Size); //<--------------
      Stream.Position := 0;
      Output.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeOutputRead);

    //Fehler Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil) do
      begin
         Stream.Write(Buffer, NumberOfBytesRead);
      end;
      OEMToAnsiBuff(Stream.Memory, Stream.Memory, Stream.Size); //<--------------
      Stream.Position := 0;
      Errors.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeErrorsRead);

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end
  else
  begin
    Result := False;
    CloseHandle(PipeOutputRead);
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsRead);
    CloseHandle(PipeErrorsWrite);
  end;
end;

Geändert von hathor (20. Aug 2015 um 06:00 Uhr)
  Mit Zitat antworten Zitat
EinsteinXXL

Registriert seit: 18. Aug 2015
8 Beiträge
 
#6

AW: CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

  Alt 20. Aug 2015, 03:10
Danke! Genau so habe ich es auch gemacht, aber du hast es weiter unten bei der Fehlerausgabe vergessen. Es gibts ja zwei StringsLists "Output" und "Error".
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

  Alt 20. Aug 2015, 03:36
Danke! Genau so habe ich es auch gemacht, aber du hast es weiter unten bei der Fehlerausgabe vergessen. Es gibts ja zwei StringsLists "Output" und "Error".
Er hat sowohl Output als auch Error verarbeitet!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

AW: CMD Ausgabe umgeleitet in Memo aber Umlaute werden nicht dargestellt

  Alt 20. Aug 2015, 06:04
Danke für den Hinweis!
Ich habe zwar keine Ahnung, was in die "Fehler Read-Pipe" hineingeschrieben wird, aber ich habe die OEMToAnsiBuff-Function hinzugefügt. Schaden tut's nicht.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz