Deutsch
Forum

Textausgabe auf die CMD-Line bei Beenden des Programms.

 

Juergen
Overr
Hallo

Kann mir jemand sagen wie ich beim Beenden eines Programms (oder auch während der Laufzeit) eine Textausgabe auf der CMD-Line erzeuge, wenn ich das Programm in einer Dos-Box starte?

Das Programm soll über eine Batch-Datei gestartet werden und nach Beendigung einen String zurückgeben, der in der DOS-Box zu sehen ist, bzw weiter verarbeitet werden kann.
Bisher hab ich dies nur über den Umweg einer separaten Datei hin bekommen.

Gruss Jürgen
XProfan10
 
18.08.2008  
 




Jörg
Sellmeyer
Du kannst das Programm nicht wirklich in einer Dos-Box laufen lassen. Es ist eben kein Dos Programm - es wird immer als eigener Prozess unter Windows laufen.

Du kannst mit Profan eine Console erzeugen:
[...] 
Da laufen dann aber wiederum keine Dos-Programme. Ob man das irgendwie verbinden kann? Such mal nach "Console", vielleicht hilft Dir da was weiter
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
18.08.2008  
 




Juergen
Overr

Du kannst das Programm nicht wirklich in einer Dos-Box laufen lassen. Es ist eben kein Dos Programm - es wird immer als eigener Prozess unter Windows laufen


Das stört nicht weiter, da ich kein Fenster erzeuge, fällt das nicht auf.

Die Suche nach Console hab ich durchgeführt.

dabei bin ich auf diesen Code gestossen:
KompilierenMarkierenSeparieren
 {$runtime prfrun32.xp9.nores.console.exe}
 {$crq}
Declare text$,x&,y&,con&,conrect#
Dim conrect#,20
Def AllocConsole(0) !"KERNEL32","AllocConsole"
Def FreeConsole(0) !"KERNEL32","FreeConsole"
Def GetStdHandle(1) !"KERNEL32","GetStdHandle"
Def SetConsoleTitle(1) !"KERNEL32","SetConsoleTitleA"
Def SetConsoleTextAttribute(2) !"KERNEL32","SetConsoleTextAttribute"
Def WriteConsole(5) !"KERNEL32","WriteConsoleA"

Proc PrintCon

    Parameters context$
    context$=context$+Chr$(13)+chr$(10)
    WriteConsole(con&,addr(context$),len(context$),addr(x&),0)

EndProc

AllocConsole()
text$="Console Testfenster"
SetConsoleTitle(addr(text$))
con&=GetStdHandle(-11)

Whileloop 100

    PrintCon "Test "+Str$(Rnd(1000))

Wend

WaitInput
FreeConsole()
End

Dieser Code ließ sich allerdings erst compilieren nachdem ich die Zeile 1 und 2 auskommentiert habe (was bedeuten diese denn??)

Eigentlich genau das was ich suche,.
Die erzeugte Ausgabe wird allerdings in einer NEUEN Console erzeugt, nicht in der in der das Programm gestartet wurde.

.
 
18.08.2008  
 




Jörg
Sellmeyer
XPSE ist ein Precompiler für XProfan [...] 

Mit der Console kann ich Dir leider nicht weiterhelfen. Der Link in meiner ersten Antwort hilft Dir nicht?
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
18.08.2008  
 




Juergen
Overr
Leider nein.

Auch in diesem Beispiel wird eine NEUE Console geöffnet.
Weiterhin bricht das Programm mit einer Fehlermeldung ab:


...Programm hat einen Fehler festgestellt und muß beendet werden ....


(gestestet unter XP-Pro 2002)

.
 
18.08.2008  
 




J.
Strahl
Die Ausgabe an das Clipboard schicken, und in der DOS Box auslesen. Allerdings, funzt das soweit auch nur mit einem Zusatzprogramm.

winclip [...] 

Damit kann man dann das Clipboard in der Console auslesen.
 
Windows 7 Ultimate 64 * 12 GB Ram * XProfan 11.2a * PRFellow * PRFPAD
18.08.2008  
 




Jörg
Sellmeyer
Ich hab das Programm mal etwas gelichtet. Vielleicht hilft es Dir.
KompilierenMarkierenSeparieren
 $I profalt.inc
PRFellow-Vorlage
Autor: Thomas Hölzer - Alle Rechte vorbehalten
Beispiel-Programm für eine fenstergebundene Konsole
Benötigt Profan 6.1 wegen Addr-Funktion
(Umstellung auf Profan 5.0 mit Bereichsvariable ist möglich)
(c) 2000 Thomas Hölzer, Siegen - Alle Rechte vorbehalten
Def AllocConsole(0) !"KERNEL32","AllocConsole"
Def CloseHandle(1) !"KERNEL32","CloseHandle"
Def CreateConsoleScreenBuffer(5) !"KERNEL32","CreateConsoleScreenBuffer"
Def FillConsoleOutputAttribute(5) !"KERNEL32","FillConsoleOutputAttribute"
Def FlushConsoleInputBuffer(1) !"KERNEL32","FlushConsoleInputBuffer"
Def FreeConsole(0) !"KERNEL32","FreeConsole"
Def GetConsoleTitle(2) !"KERNEL32","GetConsoleTitleA"
Def GetConsoleScreenBufferInfo(2) !"KERNEL32","GetConsoleScreenBufferInfo"
Def GetStdHandle(1) !"KERNEL32","GetStdHandle"
Def ReadConsole(5) !"KERNEL32","ReadConsoleA"
Def ReadConsoleOutputCharacter(5) !"KERNEL32","ReadConsoleOutputCharacterA"
Def ReadFile(5) !"KERNEL32","ReadFile"
Def SetConsoleActiveScreenBuffer(1) !"KERNEL32","SetConsoleActiveScreenBuffer"
Def SetConsoleCursorPosition(2) !"KERNEL32","SetConsoleCursorPosition"
Def SetConsoleMode(2) !"KERNEL32","SetConsoleMode"
Def SetConsoleTextAttribute(2) !"KERNEL32","SetConsoleTextAttribute"
Def SetConsoleTitle(1) !"KERNEL32","SetConsoleTitleA"
Def WriteConsole(5) !"KERNEL32","WriteConsoleA"
Def WriteConsoleOutputCharacter(5) !"KERNEL32","WriteConsoleOutputCharacterA"
Def WriteFile(5) !"KERNEL32","WriteFile"
Def OemToCharBuff(3) !"USER32","OemToCharBuffA"
Def CharToOemBuff(3) !"USER32","CharToOemBuffA"
Def FillMemory(3) !"KERNEL32","RtlFillMemory"
Def ZeroMemory(2) !"KERNEL32","RtlZeroMemory"
Def ExitProcess(1) !"KERNEL32","ExitProcess"
Def MakeLong(2) Or(&(1),Mul(&(2),$10000))
Def HiWord(1) Div&(&(1),$10000)
Def LoWord(1) And(&(1),$FFFF)
Def GetInput(0) $(0)
Def GetCleanInput(0) Upper$(Trim$($(0)))
Def RemoveCR(1) Translate$($(1),Add$(Chr$(13),Chr$(10)),Chr$(32))
Declare hinput&,houtput&,herror&,hscrbuf&
Declare BUF_INFO#,c_buf#
Declare INPUT_REC#

Proc GetScreenBufSize

    Declare size&
    Dim BUF_INFO#,20
    GetConsoleScreenBufferInfo(hscrbuf&,BUF_INFO#)
    Let size&=Long(BUF_INFO#,0)
    Let size&=LoWord(size&) * HiWord(size&) bei WideChar * 2, aber wir nehmen ANSI
    Dispose BUF_INFO#
    Return size&

EndProc

Proc LineColor

    Parameters fg%,bg%
    Declare colattr&
    Let colattr&=Or(fg%,Mul(bg%,4))
    SetConsoleTextAttribute(hscrbuf&,colattr&)

EndProc

Proc _WriteLn

    Parameters txt$,oem_convert%,cr%
    Declare written&
    Let txt$=txt$
    Case cr%: Let txt$=txt$;Chr$(13);Chr$(10)
    Dim c_buf#,(Len(txt$) + 1)
    String c_buf#,0=txt$
    Case oem_convert%: CharToOemBuff(c_buf#,c_buf#,Len(txt$))
    WriteConsole(hscrbuf&,c_buf#,Len(txt$),Addr(written&),0)
    WriteFile(hscrbuf&,c_buf#,Len(txt$),Addr(written&),0)
    Dispose c_buf#

EndProc

Proc Write

    Parameters txt$
    _Writeln txt$,1,0

EndProc

Proc WriteCR

    _Writeln "",0,1

EndProc

Proc WriteLn

    Declare txt$,i%
    Let i%=1

    WhileNot Gt(i%,%pcount)

        Let txt$=Add$(txt$,$(i%))
        Inc i%

    Wend

    _Writeln txt$,1,1

EndProc

Proc WriteCGI

    Parameters txt$
    _Writeln txt,0,0

EndProc

Proc WriteLnCGI

    Declare txt$,i%
    Let i%=1

    WhileNot Gt(i%,%pcount)

        Let txt$=Add$(txt$,$(i%))
        Inc i%

    Wend

    _WriteLn txt$,0,1

EndProc

Proc ReadLn

    Declare read&,txt$
    Dim c_buf#,261
    ZeroMemory(c_buf#,261)
    ReadConsole(hinput&,c_buf#,261,Addr(read&),0)
    Let txt$=RemoveCR(String$(c_buf#,0))
    Dispose c_buf#
    Return txt$

EndProc

Proc ReadOutput

    muß noch auf zeilenweises Auslesen umgestellt werden wg. CR
    Declare txt$,read&,size&
    GetScreenBufSize
    Let size&=&(0)
    Dim c_buf#,size&
    ZeroMemory(c_buf#,size&)
    ReadConsoleOutputCharacter(hscrbuf&,c_buf#,size&,0,Addr(read&))
    OemToCharBuff(c_buf#,c_buf#,read&)
    Let txt$=String$(c_buf#,0)
    Dispose c_buf#
    Let txt$=Translate$(txt$, "  ","")
    Return Trim$(txt$)
    Return txt$

EndProc

Proc SetConsoleCaption

    Parameters txt$
    Dim c_buf#,Add(Len(txt$),1)
    String c_buf#,0=txt$
    SetConsoleTitle(c_buf#)
    Dispose c_buf#

EndProc

Proc GotoXY

    Parameters x%,y%
     $D "",x%,y%,hscrbuf&
    SetConsoleCursorPosition(hscrbuf&,MakeLong(x%,y%))

EndProc

Proc ClearConsole

    Parameters color&
    Declare written&,size&
     $B "2"
    GetScreenBufSize
    Let size&=&(0)
    Case (color& < 7): color&=7
    FlushConsoleInputBuffer(hscrbuf&)
    SetConsoleTextAttribute(hscrbuf&,color&)
    Dim c_buf#,size&
     $B "3"
    FillMemory(c_buf#,size&,32)
    WriteConsoleOutputCharacter(hscrbuf&,c_buf#,size&,0,Addr(written&))
    FillConsoleOutputAttribute(hscrbuf&,color&,size&,0,Addr(written&))
    Dispose c_buf#
    traceon
    GotoXY 0,0
    traceoff

EndProc

Proc _CreateCon

    Parameters title$,own_win%
    Case own_win%: AllocConsole()
    SetConsoleCaption title$
    Let hinput&=GetStdHandle(-10)
    Let houtput&=GetStdHandle(-11)
    Let herror&=GetStdHandle(-12)
    Let hscrbuf&=houtput&
    SetConsoleMode(hscrbuf&,6)

EndProc

Proc CreateConsoleInWindow

    Parameters txt$
    _CreateCon txt$,1

EndProc

Proc CreateConsole

    Parameters txt$
    _CreateCon txt$,0

EndProc

Beispiel mit Mini-Befehls-Interpreter

Proc Beispiel_Ausgabe_Im_Fenster

    Declare c_exit%,txt$

    Proc Info

        WriteLn "(c) 2000 Thomas Hölzer, Siegen, Alle Rechte vorbehalten"

    EndProc

    Proc ShowHelp

        ClearConsole 31
        Info
        WriteLn ""
        WriteLn "exit oder CTRL-C : Beenden"
        WriteLn "?                : Hilfe"
        WriteLn "cls              : Bildschirm löschen"
        WriteLn "about            : Info"
        WriteLn ""

    EndProc

    CreateConsoleInWindow "32 Bit Profan²-Konsolen-Fenster - Powered by PRFellow 2001"
    CreateConsole "32 Bit Profan²-Konsole - Powered by PRFellow 2001"
    ClearConsole 31 weiß auf blau
    WriteLn "Geben Sie ? für Hilfe ein und drücken Sie ENTER"

    WhileNot c_exit%

        txt$=Trim$(ReadLn())
        txt$=GetCleanInput()

        If Equ$(txt$,"")

        ElseIf (txt$ = "ABOUT")

            Info

        ElseIf (txt$ = "EXIT")

            Inc c_exit%

        ElseIf Equ$(txt$,"?")

            ShowHelp

        ElseIf Equ$(txt$,"CLS")

            ClearConsole 31

        Else

            WriteLn Add$("Unbekannter Befehl: ",GetInput())

        EndIf

    Wend

    FreeConsole()
    ExitProcess(0)

EndProc

 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
18.08.2008  
 



Das "Problem" ist hier ein anderes - denn die Runtime trägt nicht das Consolebit. Ich kann durch patchen der Exe das Consolebit setzen und wieder solche Runtimes zum Download* anbieten - damit wird dann auch das "vorhandene" Konsolenfenster von allocconsole alloziiert und genutzt. Ich hatte imho für X9 solche Runtimes mal zum Laden im Downloadcenter angeboten.

*diesmal aber sicherheitshalber nur für diejenigen downloadbar, die auch per Kompilernachweis (siehe Verifizierung im Profil) nachgewiesen haben, dass sie auch entsprechendes XProfan besitzen
 
19.08.2008  
 




Juergen
Overr
Das würde mir sehr weiter helfen. Der Umweg über eine temp-Datei ist doch auf Dauer etwas umständlich.

(btw: Der Brief zum verifizieren ist unterwegs)

@Jörg
Ich hab mal versucht eine EXE aus dem Listing zu machen, mir fehlt dazu aber die profalt.inc

Gruß Jürgen
XProfan10
 
19.08.2008  
 




Jörg
Sellmeyer

Ich hab mal versucht eine EXE aus dem Listing zu machen, mir fehlt dazu aber die profalt.inc


Die brauchst Du mit XProfan10 auch gar nicht. Einfach auskommentieren. Noch sinnvoller:
Alle Rechen- und Vergleichsfunktionen in Operatoren umändern, z. B. x% = Add(y%,4) wird zu x% = y% + 4
Mit XProfan11 gibt es die Funktionen dann nämlich nicht mehr.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
19.08.2008  
 



[offtopic]
@Jürgen: Verifi: Bitte verzeih das ich vor dem 22. keinen Rückbrief generieren kann da ich nicht im Lande bin - das wird dann aber natürlich anschliessend von mir nachgeholt.
[/offtopic]
 
19.08.2008  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

7.876 Betrachtungen

Unbenanntvor 0 min.
Uwe Lang29.05.2024
Axel Berse30.08.2021
ByteAttack11.08.2021
Langer30.01.2021
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie