Kod do przechwytywania programów konsolowych działa w Delphi 7 ale już nie w Delphi 10.3

0

Gotowy przykład -> http://www.mediafire.com/file/kjvdm4bdelceonw/ExecuteConsole.7z/file

a tu konkretna funkcja

function ExecuteConsole(ExeName: string;Priority:cardinal):boolean;
const bufSize = 256;
var readPipe :THandle;
  writePipe :THandle;
  security :SECURITY_ATTRIBUTES;
  info :STARTUPINFO;
  process :PROCESS_INFORMATION;
  buf :array[0..bufSize-1] of char;
  bytesRead :DWord;
  text :string;
  textLen: Integer;
  newLinePos :integer;
  posLF, posCR: Integer;
  progress:string;
  line:string;
begin

  result:=FALSE;
  security.nLength:=sizeof(security);
  security.lpSecurityDescriptor:=nil;
  security.bInheritHandle:=TRUE;

  if CreatePipe(readPipe, writePipe, @security, 0)=true then
  begin
    ZeroMemory(@info, sizeof(info));
    with info do
    begin
      cb := sizeof( info );
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := 0;
      hStdOutput := writePipe;
      hStdError := writePipe;
    end;

    if CreateProcess(nil, PChar(ExeName), nil, nil, TRUE, Priority, nil, nil, info, process)=true then
    begin

      CloseHandle( writePipe );

      text:='';
      textLen := 0;
      while ReadFile( readPipe, buf, bufSize, bytesRead, nil)=true do
      begin
        textLen := Length(text);
        text:=text+buf;
        textLen := textLen + bytesRead;
        SetLength(text, textLen);
        repeat

          posLF := Pos(#10, text);
          posCR := Pos(#13, text);
          if (posLF > 0) then
            if (posCR > 0) then
              if (posLF < posCR) then
                newLinePos := posLF
              else
                newLinePos := posCR
            else
              newLinePos := posLF
          else
            newLinePos := posCR;
          if (newLinePos = 0) then break;

          line := copy(text, 1, newLinePos-1);
          if (newLinePos + 1 = posLF) or (newLinePos + 1 = posCR) then newLinePos := newLinePos + 1;
          delete(text, 1, newLinePos);

          form1.memo1.Lines.Add(line);
          application.ProcessMessages;
        until application.Terminated=true;

      end;

      if Length(text)>0 then
      begin
        form1.memo1.Lines.Add(line);
      end;
      Result := True;

    end;

    CloseHandle( readPipe );

  end;

end;

Po skompilowaniu w Delphi 7 wszystko działa jak trzeba
title

Zaś po przemieleniu w Delphi 10.3 nic się nie dzieje.

1

Na jakim systemie to odpalasz? Z tego co pamiętam to od Visty wzwyż do działania Delphi 7 potrzebowało uprawnień administratora żeby modyfikować pliki konfiguracyjne. Inaczej chyba nawet kompilator się nie odpalał. Jeśli masz uruchomione Delphi 7 z poziomu administratora a później odpalasz program to w trybie debug również ma uprawienie administratora, jeśli release odpalasz z IDE to pewnie podobnie.
Skompilowałem pod 10.2, 10.3 i wszystko działa. Nawet bez uprawnień. Proponowałbym na początek wyłączyć antywirusa i sprawdzić.

EDIT. Na początku uruchomiłem bez problemu, tą moją skompilowaną wersję. Obecnie u mnie też nie działa ale po wglądzie z debuger widać co jest na rzeczy. Po wprowadzeniu Unicode w Delphi chyba coś jeszcze będziesz musiał ustawić w swojej aplikacji. Obecnie to co jest przetwarzane przez program wygląda tak:
screenshot-20181216154150.png

2

Trzeba zmusić cmd.exe do kodowania Unicode czyli cmd.exe /U /? lub zmienić deklarację zmiennej buf na buf :array[0..bufSize -1] of AnsiChar;.

0
kAzek napisał(a):

Trzeba zmusić cmd.exe do kodowania Unicode czyli cmd.exe /U /? lub zmienić deklarację zmiennej buf na buf :array[0..bufSize -1] of AnsiChar;.

Dzięki! To było to AnsiChar zamiast Char. Wygląda na to że Char wcześniej było po prostu aliasem dla AnsiChar. W nowszych Delphi z UniCode Char to alias dla WideChar.

Ps. Mój system to win7 ,a nie vista ;)

1
Atak_Snajpera napisał(a):

Wygląda na to że Char wcześniej było po prostu aliasem dla AnsiChar. W nowszych Delphi z UniCode Char to alias dla WideChar.

Dokładnie tak – Char w Delphi 7 był równoważny z AnsiChar, a w nowszych wersjach z WideChar.

1 użytkowników online, w tym zalogowanych: 0, gości: 1