AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

cmd output in memo - Bug

Ein Thema von wschrabi · begonnen am 28. Jul 2020 · letzter Beitrag vom 28. Jul 2020
Antwort Antwort
wschrabi

Registriert seit: 16. Jan 2005
448 Beiträge
 
#1

cmd output in memo - Bug

  Alt 28. Jul 2020, 18:42
Hallo Leute,
also in https://delphi.fandom.com/wiki/Captu...altime_To_Memo ist ein super Ansatz,

Delphi-Quellcode:
procedure Tform1.CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TMemo);
 const
   CReadBuffer = 2400;
 var
   saSecurity: TSecurityAttributes;
   hRead: THandle;
   hWrite: THandle;
   suiStartup: TStartupInfo;
   piProcess: TProcessInformation;
   pBuffer: array[0..CReadBuffer] of Char;
   dRead: DWord;
   dRunning: DWord;
 begin
   saSecurity.nLength := SizeOf(TSecurityAttributes);
   saSecurity.bInheritHandle := True;
   saSecurity.lpSecurityDescriptor := nil;
 
   if CreatePipe(hRead, hWrite, @saSecurity, 0) then
   begin
     FillChar(suiStartup, SizeOf(TStartupInfo), #0);
     suiStartup.cb := SizeOf(TStartupInfo);
     suiStartup.hStdInput := hRead;
     suiStartup.hStdOutput := hWrite;
     suiStartup.hStdError := hWrite;
     suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
     suiStartup.wShowWindow := SW_HIDE;
 
     if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity,
       @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)
       then
     begin
       repeat
         dRunning := WaitForSingleObject(piProcess.hProcess, 100);
         Application.ProcessMessages();
         repeat
           dRead := 0;
           ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
           pBuffer[dRead] := #0;
 
           OemToAnsi(pBuffer, pBuffer);
           AMemo.Lines.Add(String(pBuffer));
         until (dRead < CReadBuffer);
       until (dRunning <> WAIT_TIMEOUT);
       CloseHandle(piProcess.hProcess);
       CloseHandle(piProcess.hThread);
     end;
 
     CloseHandle(hRead);
     CloseHandle(hWrite);
   end;
end;



doch leider bekomme ich in zeile
   if CreatePipe(hRead, hWrite, @saSecurity, 0) then Diesen Error:
[dcc64 Fehler] BUnit1.pas(1313): E2010 Inkompatible Typen: 'PAnsiChar' und 'array[0..2400] of Char' Ich kenne mich nicht ganz aus, es sit pBuffer ja ein array of Char, und das CretePipe braucht PChar.

Wie kann man den Fehler beheben? Ich habe Delphi Berlin.

DANKE
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: cmd output in memo - Bug

  Alt 28. Jul 2020, 18:44
Hallo,

alt
pBuffer: array[0..CReadBuffer] of Char;

neu
pBuffer: array[0..CReadBuffer] of AnsiChar;


Oh, ich glaube, falsch gelesen.
Heiko

Geändert von hoika (28. Jul 2020 um 18:56 Uhr)
  Mit Zitat antworten Zitat
wschrabi

Registriert seit: 16. Jan 2005
448 Beiträge
 
#3

AW: cmd output in memo - Bug

  Alt 28. Jul 2020, 19:10
Danke, ja der Fehler ist damit gelöst,
doch ich bekomm noch einen neuen jetzt:

[dcc32 Fehler] BUnit1.pas(1298): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen bei der Zeile:
 if CreatePipe(hRead, hWrite, @saSecurity, 0) then Ich habe Windows 10 und Berlin.
ist CreatePipe auch verändert worden?

DANKE
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: cmd output in memo - Bug

  Alt 28. Jul 2020, 19:24
Seit 2009 ist Delphi standardmäßig auf Unicode

string = UnicodeString (vorher AnsiString)
Char = WideChar (vorher AnsiChar)
PChar = PWideChar (vorher PAnsiChar)

CreatePipe zeigt nun eben auf CreatePipeW, wo es früher CreatePipeA war,
so wie fast alle WinAPI, sowie die RTL, VCL usw., die in Delphi mitgeliefert werden.

Jeder Code, der in damaligen Compilern fahrlässig mit compilierabhängigen Typen geschrieben wurde
und vor allem wo auch noch dynamische mit statischen Typen gemischt werden,
ist nun fehlerhaft, weil sich eben diese Typen geändert haben.



Man kann nun als Bugfix erstmal alles wieder auf ANSI zurückbringen
oder man schaut, wo es Unicode gibt und bringt es in einen aktuelleren Zustand.
So oder so, man muß es eben "zusamenhängend" mit den zusammenpassenden Typen und APIs entweder fix auf ANSI oder Unicode bringen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (28. Jul 2020 um 19:30 Uhr)
  Mit Zitat antworten Zitat
wschrabi

Registriert seit: 16. Jan 2005
448 Beiträge
 
#5

AW: cmd output in memo - Bug

  Alt 28. Jul 2020, 19:49
Ja DANKE, so hab ich es mir auch gedacht.
Aber CreatePipeA findet er überhaupt nicht.
muss ich da eine Unit einbinden?
DANKE HERZLICHST:

hier sind aber alle paramter da laut IDE Unterstuützung bei CreatePipe.

Vielleicht hilf das, aber ich kenne mich nicht aus: https://stackoverflow.com/questions/...command-prompt


mfg
w

Geändert von wschrabi (28. Jul 2020 um 19:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: cmd output in memo - Bug

  Alt 28. Jul 2020, 20:03
Ups, falsch geguckt. Dachte im TSecurityAttributes gibt es auch ein paar "Char".
Wenn die API keine Chars als Parameter oder in Records hat, dann braucht man sie natürlich nicht doppelt.

Microsoft kam auf die geile IDE seine Webseite umzubauen, so funktionieren viele Links nicht mehr.
https://docs.microsoft.com/en-us/win...api-createpipe
https://docs.microsoft.com/en-us/pre...79560(v=vs.85) = toter Link
https://docs.microsoft.com/en-us/pre...79560(v=vs.85) = richtig

anderes Beispiel, was dich aber betrifft (CreateProcessA)
https://docs.microsoft.com/en-us/win...createprocessa
wobei hier nun "alles" mit W, weil ja jetzt unicode, aber da dein ACommand und AParameters Strings und keine UnicodeStrings sind, hier natürlich "alles" dynamisch und ohne A oder W.
Und natürlich muß auch OemToAnsi unbedingt als ANSI implementiert werden, A) weil ANSI ankommt und B) weil man bei der Unicode-Version mit den Parametern aufpassen muß, denn dort ist es verboten inplace übersetzen zu lassen, also niemals mit dem selben Ein- und Ausgabepuffer.

Alles was pBuffer betrifft muß ANSI sein, vor der Übersetung OEM to ANSI (ich weiß, aber OEM ist auch eine ANSI-Codepage und mit "ToANSI" ist hier die lokale ANSI-Codepage gemeint)
Aber ich würde statt MSDN-Library durchsuchenOemToAnsi empfehlen TMBCSEncoding.Create(437, 0, 0) oder TEncoding.GetEncoding(437) zu verwenden.
https://docs.microsoft.com/en-us/win...ntl/code-pages


Allerdings kommt es auch drauf an, was für eine ANSI-Codepage wirklich aus dem Programm kommt,
denn das kann OEM, ANSI, UTF-8 oder sonstwas sein,
somit wäre es bestimmt intelligent die CP_OEM (437) nicht direkt zu übergeben, sondern als Parameter.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (28. Jul 2020 um 20:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#7

AW: cmd output in memo - Bug

  Alt 28. Jul 2020, 20:06
doch leider bekomme ich in zeile
   if CreatePipe(hRead, hWrite, @saSecurity, 0) then Diesen Error:
[dcc64 Fehler] BUnit1.pas(1313): E2010 Inkompatible Typen: 'PAnsiChar' und 'array[0..2400] of Char'
Da passt etwas nicht, denn in der Zeile mit CreatePipe ist nichts in Richtung P(Ansi)Char oder array of Char zu finden, weil diese Funktion gar keinen Stringtypen als Parameter hat. Vermutlich meinst du die Zeile mit ReadFile oder OemToAnsi, halt irgendetwas wo PChar oder array of Char verwendet wird. Bitte genaue Beschreibungen posten, sonst sucht man an der völlig falschen Stelle und vergeudet dabei Zeit, deine und die der Helfer.

Grüße
Dalai
  Mit Zitat antworten Zitat
Antwort Antwort

 

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