Odczytywanie danych z kosoli przez inny program

0

Witajcie,
mam problem z którym nie mogę sobie poradzić.
Mam aplikację napianą w Delphi która na konsoli wyświetla różnego rodzaju dane.
Chciałbym aplikacją okienkową napisaną w C# pobierać te informacje z tej konsoli i obrabiać je wg własnego uznania.
Czy ktoś ma pomysł jak to rozwiązać? Nie mogę wymyślić sposobu jak dobrać się do tamtych danych.

Pozdrawiam

0

Zakładam, że Twoja aplikacja okienkowa uruchomi tą aplikację Delphi, wtedy coś takiego:

Process process = new Process();
process.StartInfo = new ProcessStartInfo();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.FileName = "Tutaj ścieżka do programu Delphi";
process.StartInfo.Arguments = "Tutaj ewentualne argumenty";
process.OutputDataReceived += (sender, args) => Console.WriteLine("W tym zdarzeniu masz dane z aplikacji Delphi");
process.Start();
process.BeginOutputReadLine();

Mogłem się gdzieś pomylić, ale idea jest taka jak wyżej.

Edit:
Musiałem edytować, bo się pomyliłem =]

0

mam teraz coś takiego:

Process process = new Process();
            string cmd;

            process.StartInfo.CreateNoWindow = false;
            process.StartInfo.ErrorDialog = false;
            process.StartInfo.FileName = "aaaa";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.RedirectStandardInput = true;
            process.StartInfo.RedirectStandardOutput = true;
            process.Start();

            process.BeginOutputReadLine();
            process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);

            label:

            cmd = Console.ReadLine();
            process.Refresh();
            process.StandardInput.WriteLine(cmd);
            
            goto label; 

Niby wszystko działa, bo dane są wysyłąne do aplikacji w Delphi. Niestety nie mogę ich pobrać. Dopiero w momencie wysłania komendy zamykającej drugą aplikację zasysane jest wszystko co wyświetliło się w tamtej aplikacji.

Jak mogę próbować to rozwiązać?

0

Najważniejsze: nie używamy goto.

Czy ta aplikacja Delphi przypadkiem nie buforuje swojego wyjścia ? Tak by to wyglądało. Czy masz dostęp do źródeł tej aplikacji Delphi ?

0

Tak, na razie mam, ponieważ napisałem swoją prostą apkę aby sprawdzić tą komunikację zanim dostanę gotową od osoby trzeciej

     Writeln('Polaczenie Delphi i C#');
        poczatek:

        ReadLn(polecenie);

        If(polecenie = 'hue') then
        begin
          WriteLn('otzrymano');
        end;

        If  (polecenie = 'kbInitialize') then
        begin
        ReadLn(hInstance);
        kbInitialize(hInstance);
        end;

        if  (polecenie = 'exit') then
        begin
          exit;
        end;

        If  (polecenie = 'kbOpen') then
        begin
        ReadLn(sciezka);
        pFileName := Pchar(sciezka);
        ReadLn(wnd);
        wynik := kbOpen(hInstance,pFileName,wnd);
        Writeln(wynik)

        end;

        GoTo poczatek;

Czy jestnieje możliwość wyłączenia tego buforowania?

0

Nie znam Delhi, ale szukaj funkcji/metody o nazwie Flush.
Ewentualnie może to być ustawiane gdzieś globalnie, tutaj nie pomogę, bo Delphi to nie mój świat :)

0

Moim światem Delphi też nie jest:)
Ostateczie udało mi się rozwiązać problem dodając Flush

         
If(polecenie = 'hue') then
        begin
          Writeln(Output, 'otrzymano');
          Flush(Output);
        end;

Dziękuję serdecznie za pomoc

0

Bingo ! Super, że działa, powodzenia :)

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