AllocConsole FreeConsole i Writeln nie działa dla aplikacji graficznej

0

Jak aplikacja jest graficzna to mogę wyswietlic konsole za pomocą AllocConsole

Dlaczego taki kod nie działa ?

Dokumentacja czarno na białym pokazuje ze powinno dzialac
https://docs.microsoft.com/en-us/windows/console/freeconsole

  AllocConsole;
  Writeln('1');
  FreeConsole;

  AllocConsole;
  Writeln('2'); // tutaj jest wyjątek  !!!
  FreeConsole;


  AllocConsole;
  Writeln('3');
  FreeConsole;
0

Zapewne dlatego, że uchwyt na standardowe wyjście (stdout) dalej jest przypisany do starej konsoli. Użyj GetStdHandle(), żeby pobrać uchwyt wyjścia dla nowej konsoli i przypisz go do stdout.

0
Adamek Adam napisał(a):

Dlaczego taki kod nie działa ?

A sprawdziłeś w którym momencie program zaczyna robić coś czego nie chcesz? Wszystkie funkcje z systemowego API to funkcje, a więc zwracają jakiś wynik operacji, który należy sprawdzić aby wiedzieć co robić dalej. W przypadku funkcji AllocConsole i FreeConsole wynikiem jest wartość logiczna, więc sprawdź w który momencie dostajesz False – wtedy będzie można coś pomyśleć.

A żeby wiedzieć co konkretnie poszło nie tak, sprawdź co zwraca GetLastError.

Dokumentacja czarno na białym pokazuje ze powinno dzialac
https://docs.microsoft.com/en-us/windows/console/freeconsole

Ale nie działa, więc coś robisz źle.

  Writeln('2'); // tutaj jest wyjątek  !!!

Jaki wyjątek?! Treść podaj zamiast krzyczeć, że się wysypuje… :/

2

Funkcje AllocConsole i FreeConsole nie zwracaja FALSE

Zastanawia mnie magia polecenia Writeln ;)
Jak aplikacja się uruchamia to writeln nie działa bo aplikacja nie ma konsoli i to jest OK bo nie ma uchwytu do pliku
Uruchamiam funkcje z API windows-a AllocConsole i nagle writeln działa (w jaki sposób ?)

A rozwiązanie problemu jest banalne , po zwolnieniu konsoli "FreeConsole " trzeba dodać ReWrite

allocconsole;
ReWrite(Output);
0
Adamek Adam napisał(a):

Funkcje AllocConsole i FreeConsole nie zwracaja FALSE

Czyli problemem jest sam WriteLn i tutaj pasuje mieć treść wyjątku.

Zastanawia mnie magia polecenia Writeln ;)
[…]
Uruchamiam funkcje z API windows-a AllocConsole i nagle writeln działa (w jaki sposób ?)

Wszystko zależy od kompilatora i biblioteki standardowej. Sam WriteLn jest pseudoprocedurą, czyli tworem nie posiadającym swojej definicji. Output dla wszystkich jej wywołań jest emitowany dynamicznie w trakcie kompilacji, więc aby wiedzieć co dokładnie wykonuje, trzeba albo zagłębić się w kod kompilatora, albo sprawdzić kod assemblerka.

Nie wiem jak w Delphi, ale w Lazarusie do trzymania uchwytu służy zmienna StdOutputHandle. Podczas dynamicznego tworzenia konsoli trzeba dodatkowo przypisać True do globalnej zmienej IsConsole i wywołać procedurę SysInitStdIO, która to pobiera uchwyty, przypisuje je do różnych zmiennych i wywołuje na nich Assign (jest ich pięć, wszystkie typu Text).

A rozwiązanie problemu jest banalne , po zwolnieniu konsoli "FreeConsole " trzeba dodać ReWrite

Sprawdź pod menedżerem pamięci czy taki kod nie powoduje wycieków pamięci.

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