Print in die Konsole von cmd.exe umleiten

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

hazumu-kun

Betreff: Print in die Konsole von cmd.exe umleiten

BeitragDi, Dez 29, 2009 8:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Folgendes Problem:

Viele Kommandozeilen-Tools pflegen es ihre Ausgaben DIREKT im aufrufendem Konsolenfenster anzuzeigen.
Das standard 08/15 Print von Blitz will aber IMMER ein neues Fenster öffnen, sehr ärgerlich wenn z.B. nur eine Helppage zu den Parametern angezeigt wird und dann ein "End" kommt.

Frage:
Gibt es eine Möglichkeit dieses Problem zu umgehen?
Meinetwegen auch per Winapi, ungefähr so:
Code: [AUSKLAPPEN]

Function Print (txt$)
    api_Print_to_console_window_that_executed_this_programm (txt$)
End Function


Ich weiß das es SO einfach nicht geht, aber die Idee hat jetzt (hoffentlich) jeder verstanden.

Freue mich auf Hinweise, Links zur unübersichtlichen MSDN(bin zu blöd zum Finden) nehme ich auch gerne.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Silver_Knee

BeitragDi, Dez 29, 2009 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
hab grad versucht ne dll dafür zu schreiben...

Code: [AUSKLAPPEN]
extern "C" __declspec( dllexport ) const void __stdcall ConsolePrint(char* text);

using namespace std;

const void __stdcall ConsolePrint(char* text)
{
   cout << text;
}

ziemlich naiv gell Wink funktioniert leider net. hat jemand ahnung und kann sagen warum? Wink
 

ChristianK

BeitragDi, Dez 29, 2009 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Damit kannst du in die Konsole schreiben: http://msdn.microsoft.com/en-u...S.85).aspx
Brauchst aber noch ein paar andere der Konsolen-Funktionen dafür (siehe Links unten auf der Seite).
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

hazumu-kun

BeitragDi, Dez 29, 2009 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Link ist gebookmarked, ich schaus mir an wenn die motivation wieder da ist, danke im vorraus
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

hazumu-kun

BeitragDi, Dez 29, 2009 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmn, das gestaltet sich verdammt schwierig.
Kennt sich hier jemand mit der WinAPI sehr gut aus der mir ein kleinen Proof of Concept zusammenschustern kann?

Meine bisher mikkerlichen und nicht funktionierenden Ergebnisse:
BlitzBasic: [AUSKLAPPEN]

If Not api_AttachConsole (-1) Then RuntimeError "FUCK!"
Local hconsole= api_GetStdHandle (-11)

Local buffer= CreateBank(4)
PokeByte buffer,0,Asc("T")
PokeByte buffer,1,Asc("e")
PokeByte buffer,2,Asc("s")
PokeByte buffer,3,Asc("t")

Local written= CreateBank(4)

api_WriteFile (hconsole,buffer,4,written,0)
Notify PeekInt(written,0)+" written."


Ergebnis: xyz.exe hat ein Problem festgestellt.

HINWEIS: Code kompilieren und per cmd starten, damit attachconsole auch funktioniert
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
  • Zuletzt bearbeitet von hazumu-kun am Di, Dez 29, 2009 15:58, insgesamt einmal bearbeitet

Nicdel

BeitragDi, Dez 29, 2009 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kenne mich recht gut aus. Das Problem ist, dass man ein Konsolenfenster erst öffnen müsste.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

hazumu-kun

BeitragDi, Dez 29, 2009 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist offen, und zwar das von cmd.exe, in das ich per AttachConsole reinsteige, siehe oben.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Der Eisvogel

BeitragDi, Dez 29, 2009 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Darf ich mal blöd fragen, wieso du api_WriteFile nutzt?
EDIT: Und du wirst so wie du veruscht, an das Handle der Konsole zu kommen, nix bekommen, da, soweit ich weiß, Programme, die man übers cmd startet nicht gleich auch Child des cmd-Fensters sind.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

hazumu-kun

BeitragDi, Dez 29, 2009 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, sind sie. Problem ist das ich wahrscheinlich irgendwas an den Datenstrukturen vermassel.
Schafft es irgendjemand ein laufendes Beispiel zu coden oder was in ner DLL zu wrappen?
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Der Eisvogel

BeitragDi, Dez 29, 2009 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich bin tatsächlich dafür, dass du mal anstatt api_WriteFile die oben angegebene Funktion "api_WriteConsole" verwendest:
Code: [AUSKLAPPEN]

If Not api_AttachConsole (-1) Then RuntimeError "FUCK!"
Local hconsole= api_GetStdHandle (-11)

Local buffer= CreateBank(4)
PokeByte buffer,0,Asc("T")
PokeByte buffer,1,Asc("e")
PokeByte buffer,2,Asc("s")
PokeByte buffer,3,Asc("t")

Local written= CreateBank(4)

api_WriteConsole (hconsole,buffer,4,written,0)
Notify PeekInt(written,0)+" written."


und Userlibs:
Zitat:
.lib "kernel32.dll"
api_AttachConsole%(dwProcessId%) : "AttachConsole"
api_GetStdHandle%(nStdHandle%) : "GetStdHandle"
api_WriteConsole%(hConsoleOutput%,lpBuffer*,nNumberOfCharsToWrite%,lpNumberOfCharsWritten*,lpReserved%) : "WriteConsoleA"


Das funktioniert nämlich so hervoragend.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

hazumu-kun

BeitragDi, Dez 29, 2009 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
WTF!?
Ich hatte EINEN verdammten Tippfehler in meinen kernel32.decls!

Sehr großen vielen dicken dank Eisvogel, du bist mein Vogel des Tages.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Nicdel

BeitragDi, Dez 29, 2009 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest dir per AllocConsole auch deinen eigene holen, dann musst du das Programm nicht über CMD starten.

P.S.: Das Ganze funktioniert unter Windows 7 nicht mehr!

Edit:
Hier noch eine Funktion dafür, mit Beispiel:
BlitzBasic: [AUSKLAPPEN]
AllocConsole()

SetConsoleTitle("Test")

Print WriteToConsole("Hallo Welt!")

WaitKey


Function WriteToConsole%(txt$)

Local hConsole = GetStdHandle(-11)

Local TextBuffer = CreateBank(Len(txt))

For i = 0 To Len(txt)-1

PokeByte TextBuffer, i, Asc(Mid(txt$,i+1,1))

Next

Local WriteBuffer = CreateBank(4)

WriteConsole (hConsole, TextBuffer, Len(txt$), WriteBuffer, 0)

Return PeekInt(WriteBuffer,0)

End Function


Decls:
Code: [AUSKLAPPEN]
AllocConsole() : "AllocConsole"
GetStdHandle%(nStdHandle%) : "GetStdHandle"
WriteConsole%(hConsoleOutput%,lpBuffer*,nNumberOfCharsToWrite%,lpNumberOfCharsWritten*,lpReserved%) :

"WriteConsoleA"
SetConsoleTitle%(title$) : "SetConsoleTitleA"


Achtung: Funktioniert nur bei der erstellten Exe!

hazumu-kun

BeitragDi, Dez 29, 2009 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch Win7 kompatibel?
EDIT: Sinn der Aktion ist es ja in das Konsolenfenster von cmd.exe hineinzuschreiben, das funtioniert per AttachConsole und process id -1 (parent) sehr gut.

Folgender Code rennt uner win7 genauso gut:
BlitzBasic: [AUSKLAPPEN]

If Not api_AttachConsole (-1) Then RuntimeError "FUCK!"
Local hconsole= api_GetStdHandle (-11)

Local buffer= CreateBank(4)
PokeByte buffer,0,Asc("T")
PokeByte buffer,1,Asc("e")
PokeByte buffer,2,Asc("s")
PokeByte buffer,3,Asc("t")

Local written= CreateBank(4)

api_WriteConsole (hconsole,buffer,4,written,0)
Notify PeekInt(written,0)+" written."
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Nicdel

BeitragDi, Dez 29, 2009 23:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, stimmt, ich hatte nen Fehler in der Decls Very Happy
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

flona

BeitragMi, Dez 30, 2009 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir mal erlaubt das in ein paar Funktionen zu packen Rolling Eyes . Ändert man in der Decls lpBuffer* zu lpBuffer$ spart man sich den Umweg die Bytes einzeln in eine Bank zu schreiben. Wink
BlitzBasic: [AUSKLAPPEN]
CMD_Init ( )
CMD_WriteLn ( "Parameters overview:" )
CMD_WriteLn ( "-c Compile ...." )
CMD_Write ( "...." )


Global hConsole
Function CMD_Init( )
If Not api_AttachConsole( -1 ) Then RuntimeError "Error attaching console!"
hConsole = api_GetStdHandle( -11 )
End Function

Function CMD_Write( Txt$ )
Local BytesWritten = CreateBank( 4 )
api_WriteConsole( hConsole, Txt$, Len( Txt$ ), BytesWritten, 0 )

Local Written = PeekInt( BytesWritten, 0 )
FreeBank BytesWritten
Return Written
End Function

Function CMD_WriteLn( Txt$ )
Txt$ = Txt$+Chr( 13 )+Chr( 10 )
Local BytesWritten = CreateBank( 4 )
api_WriteConsole( hConsole, Txt$, Len( Txt$ ), BytesWritten, 0 )

Local Written = PeekInt( BytesWritten, 0 )
FreeBank BytesWritten
Return Written
End Function


Decls hat Folgendes geschrieben:
.lib "kernel32.dll"
api_AttachConsole%(dwProcessId%):"AttachConsole"
api_GetStdHandle%(nStdHandle%):"GetStdHandle"
api_WriteConsole%(hConsoleOutput%,lpBuffer$,nNumberOfCharsToWrite%,lpNumberOfCharsWritten*,lpReserved%):"WriteConsoleA"
www.Dreier-Florian.kilu.de
Intel Core 2 Quad Q9400 | Zotac 9800GT | 4GB RAM | 1TB HDD | Windows 7 Professional 32bit

hazumu-kun

BeitragMo, März 08, 2010 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, vielen herzlichen Dank.
Ich wurde auf den Thread nochmal aufmerksam als jemand ein ähnliches Problem postete.
Habh den Thread hier ganz vergessen gehabt.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group