DOS-Fenster in Gadget umleiten, geht so was?
DOS-Fenster in Gadget umleiten, geht so was?
DOS-Fenster in Gadget umleiten, geht so was?
Konkrekt hätte ich gerne die Meldungen von mkisofs in ein eigenes Fenster umgeleitet und nicht im DOS-Fenster ...
Konkrekt hätte ich gerne die Meldungen von mkisofs in ein eigenes Fenster umgeleitet und nicht im DOS-Fenster ...
jo ..geht
Dank an Herrn S. Rings
den Programmaufruf entsprechend anpassen ..und den Rest auch
Dank an Herrn S. Rings
den Programmaufruf entsprechend anpassen ..und den Rest auch
Code: Alles auswählen
; Redirect Outputs into Memory
; coded by Siegfried Rings march 2002
; redirected the pipes
;
; see http://support.microsoft.com/default.aspx?scid=kb;EN-US;q173085
;
;mCommand.s="net start|find "+Chr(34)+"CACHE"+Chr(34)+" "
mcommand.s="netstat -o"
;mcommand.s="dir "
SetClipboardText(mcommand)
;Structure used by the CreateProcessA function
;another then that Fred implemented !
Structure MySTARTUPINFO
cb.l
lpReserved.l
lpDesktop.l
lpTitle.l
dwX.l
dwY.l
dwXSize.l
dwYSize.l
dwXCountChars.l
dwYCountChars.l
dwFillAttribute.l
dwFlags.l
wShowWindow.w
cbReserved2.w
lpReserved2.l
hStdInput.l
hStdOutput.l
hStdError.l
EndStructure
proc.PROCESS_INFORMATION ;Process info filled by CreateProcessA
Returnval.l ;long variable For get the Returnvalurn value of the
start.MySTARTUPINFO ;StartUp Info passed To the CreateProceeeA
sa.SECURITY_ATTRIBUTES ;Security Attributes passeed To the
hReadPipe.l ;Read Pipe handle created by CreatePipe
hWritePipe.l ;Write Pite handle created by CreatePipe
lngBytesread.l ;Amount of byte Read from the Read Pipe handle
strBuff.s=Space(256) ;String buffer reading the Pipe
;Consts For functions
#NORMAL_PRIORITY_CLASS = $20
#STARTF_USESTDHANDLES = $100
#STARTF_USESHOWWINDOW = $1
;Create the Pipe
sa\nLength =SizeOf(SECURITY_ATTRIBUTES) ;Len(sa)
sa\bInheritHandle = 1
sa\lpSecurityDescriptor = 0
Returnval = CreatePipe_(@hReadPipe, @hWritePipe, @sa, 0)
If Returnval = 0
;If an error occur during the Pipe creation exit
MessageRequester("info", "CreatePipe failed. Error: ",0)
End
EndIf
start\cb = SizeOf(MySTARTUPINFO)
start\dwFlags = #STARTF_USESHOWWINDOW | #STARTF_USESTDHANDLES
;set the StdOutput And the StdError output To the same Write Pipe handle
start\hStdOutput = hWritePipe
start\hStdError = hWritePipe
;Execute the command
Returnval = CreateProcess_(0, mcommand, sa, sa, 1, #NORMAL_PRIORITY_CLASS, 0, 0, @start, @proc)
If Returnval <> 1
MessageRequester("Info","File Or command not found", 0)
End
Else
;MessageRequester("Info","PRG started..:",0)
EndIf
;Now We can ... must close the hWritePipe
Returnval = CloseHandle_(hWritePipe)
mOutputs.s = ""
;Read the ReadPipe handle
readmax = 255
If OSVersion() = #PB_OS_Windows_98
Repeat
Returnval = ReadFile_(hReadPipe, strBuff, readmax, @lngBytesread, 0)
If lngBytesread>0
mOutputs = mOutputs + Left(strBuff, lngBytesread)
EndIf
Until lngBytesread < readmax
Else
Repeat
Returnval = ReadFile_(hReadPipe, strBuff, readmax, @lngBytesread, 0)
If lngBytesread>0
mOutputs = mOutputs + Left(strBuff, lngBytesread)
EndIf
Until Returnval = 0
EndIf
;Close the opened handles
Returnval = CloseHandle_(proc\hProcess)
Returnval = CloseHandle_(proc\hThread)
Returnval = CloseHandle_(hReadPipe)
;Returnval=CloseHandle_(hWritePipe)
;Returnvalurn the Outputs property with the entire DOS output
OEMToChar_(mOutputs,mOutputs)
LoadFont(0,"courier new",8)
mw=OpenWindow(0,0,0,600,800,#PB_Window_ScreenCentered,"Aha")
CreateGadgetList(WindowID(0))
SetGadgetFont(#PB_Default, UseFont(0))
ButtonGadget(10,0,0,100,20,"ok",#PB_Button_Default)
TextGadget(1,0,20,600,800,mOutputs)
Repeat
Event = WaitWindowEvent()
If Event = #PB_EventGadget
;Debug "WindowID: " + Str(EventWindowID())
GadgetID = EventGadgetID()
If GadgetID = 10
; Debug "GadgetID: #Gadget_0"
;MessageRequester("","och",0)
End
EndIf
EndIf
Until Event = #PB_EventCloseWindow
pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
@ Umleiten von Konsolenausgaben:
ich habe mich mal einige Stunden mit diesem Thema gespielt und
folgendes rausgefunden:
- der angegebene Code mit der Pipe funktioniert gut mit allem was
man an CMD commands aufruft wie dir, ver etc. und keine
dynamischen Komponenten hat (z.B. Zähler wie bei format a: )
- Bei sonstigen Konsolenprogrammen sieht es unterschiedlich aus:
weniges geht, vieles nicht. Abfragen etc. sind z.T. schwierig zu
behandeln. Dynamische Vorgänge sind ebenso nicht abzufangen.
- Überhaupt nicht läuft es mit 16Bit Konsolenprogrammen. Selbst bei
einfachen Programmen gelingt es nicht an den Konsoleninhalt zu
gelangen .... Auch das Senden von Keys geht nicht mit den üblichen
Methoden.....
Wenn hier jemand eine Lösung für 16 Bit Konsolen hätte, wäre eine
Kiste Bier fällig ... An sich müssen die Bildschirminhalte irgendwo
im Speicher sein, bloß man kommt nicht an die Handles....
Cu von Team100
ich habe mich mal einige Stunden mit diesem Thema gespielt und
folgendes rausgefunden:
- der angegebene Code mit der Pipe funktioniert gut mit allem was
man an CMD commands aufruft wie dir, ver etc. und keine
dynamischen Komponenten hat (z.B. Zähler wie bei format a: )
- Bei sonstigen Konsolenprogrammen sieht es unterschiedlich aus:
weniges geht, vieles nicht. Abfragen etc. sind z.T. schwierig zu
behandeln. Dynamische Vorgänge sind ebenso nicht abzufangen.
- Überhaupt nicht läuft es mit 16Bit Konsolenprogrammen. Selbst bei
einfachen Programmen gelingt es nicht an den Konsoleninhalt zu
gelangen .... Auch das Senden von Keys geht nicht mit den üblichen
Methoden.....
Wenn hier jemand eine Lösung für 16 Bit Konsolen hätte, wäre eine
Kiste Bier fällig ... An sich müssen die Bildschirminhalte irgendwo
im Speicher sein, bloß man kommt nicht an die Handles....
Cu von Team100
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
>Warum bauste nicht einfach direkt ne Verbindung zum Router auf o_O?
Naja, würd ich ja ganz gern. Aber das Telnet Protokoll scheint nicht ganz trivial zu sein. Hab ma Auszugsweise ins RFC geschaut. Das wäre für meine kleine Anwendung ( Netzauslastung des Switches loggen ) ein doch nicht ganz unerhebliches Forschungsprojekt, zumal ich auch nicht gerade Fit bin was PB betrifft. Es würde mir also reichen die Telnet Console in Textform auszulesen...
Naja, würd ich ja ganz gern. Aber das Telnet Protokoll scheint nicht ganz trivial zu sein. Hab ma Auszugsweise ins RFC geschaut. Das wäre für meine kleine Anwendung ( Netzauslastung des Switches loggen ) ein doch nicht ganz unerhebliches Forschungsprojekt, zumal ich auch nicht gerade Fit bin was PB betrifft. Es würde mir also reichen die Telnet Console in Textform auszulesen...
Probier's für telnet mal damit (nur Subroutine - also nicht direkt lauffähig:
Ist eine Routine, die ich mal irgendwo gefunden habe und etwas modifiziert habe 
Jedenfalls hatte ich damit mal mit meinem Router experimentiert und sie hat funktioniert.
Für das von dir angesprochene Beispiel wäre der Aufruf mit:
TelnetLog("192.168.0.1", "DEINPASSWORT", "sh status")
In der Routine müsstest du noch die "If FindString(Command$,...." und "anfang = FindString(telnetlog$,.." Zeilen an die Rückmeldungen deines Routers anpassen. Das ist also das, was der Router bei dir "schreibt", wenn er dich zur Eingabe des Passwortes auffordert bzw. zur Eingabe eines Telnet-Befehls.
Anmerkung: Eventuell ist die Zeilenende-Konvertierung bei dir nicht erforderlich - musst eben schauen, was dein Router da so auswirft ...
Gruß,
Martin
Code: Alles auswählen
Procedure.s TelnetLog(ip$, passwort$, logbefehl$)
*Buffer = AllocateMemory(#TelnetBuffer, 10000)
EOL$ = Chr(13)+Chr(10)
telnetlog$ = ""
If InitNetwork()
ConnectionID = OpenNetworkConnection(ip$, 23)
If ConnectionID
Delay(5)
Repeat
Delay(10)
Result = NetworkClientEvent(ConnectionID)
Select Result
Case 2
Repeat
Delay(10)
RequestLength.l = ReceiveNetworkData(ConnectionID, *Buffer, 5000)
telnetlog$ = telnetlog$ + PeekS(*Buffer)
Until RequestLength.l < 5000
Command$ = PeekS(*Buffer)
Var$ = Space(RequestLength)
PokeS(*Buffer,Var$)
If FindString(Command$,"Password",0) ;--- "Password" indviduell anpassen
SendNetworkString(ConnectionID, passwort$+EOL$)
EndIf
If FindString(Command$,"Type ?",0) ;--- "Type ?" indviduell anpassen
SendNetworkString(ConnectionID, logbefehl$+EOL$)
EndIf
EndSelect
Until Result = 0
EndIf
EndIf
FreeMemory(#TelnetBuffer)
CloseNetworkConnection(ConnectionID)
; Zeilenende in Windows-Format kovertieren
ReplaceString(telnetlog$,Chr(10)+Chr(13),Chr(13)+Chr(10),2)
; Leerzeilen löschen
telnetlog$ = ReplaceString(telnetlog$,Chr(13)+Chr(10)+Chr(13)+Chr(10),Chr(13)+Chr(10))
anfang = FindString(telnetlog$,"Password",1) ;--- "Password" indviduell anpassen
telnetlog$ = Mid(telnetlog$,anfang, Len(telnetlog$)-anfang)
ProcedureReturn telnetlog$
EndProcedureJedenfalls hatte ich damit mal mit meinem Router experimentiert und sie hat funktioniert.
Für das von dir angesprochene Beispiel wäre der Aufruf mit:
TelnetLog("192.168.0.1", "DEINPASSWORT", "sh status")
In der Routine müsstest du noch die "If FindString(Command$,...." und "anfang = FindString(telnetlog$,.." Zeilen an die Rückmeldungen deines Routers anpassen. Das ist also das, was der Router bei dir "schreibt", wenn er dich zur Eingabe des Passwortes auffordert bzw. zur Eingabe eines Telnet-Befehls.
Anmerkung: Eventuell ist die Zeilenende-Konvertierung bei dir nicht erforderlich - musst eben schauen, was dein Router da so auswirft ...
Gruß,
Martin
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
