| |
|
|
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 |
|
|
| |
|
|
|
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.
. |
|
|
| |
|
|
|
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)
. |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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] |
|
|
| |
|
|