DOS-Fenster in Gadget umleiten, geht so was?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

DOS-Fenster in Gadget umleiten, geht so was?

Beitrag von DataMiner »

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 ...
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

jo ..geht
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.
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

AHHH, ich liebe dieses Forum - herzlichen Dank!
Icke
Beiträge: 143
Registriert: 08.09.2004 13:19

Beitrag von Icke »

Hmmm, geht sowas auch mit Telnet? Mir schwebt da z.B. ein Connect mit Befehlsabfolge auf den Router vor und das Ergebnis dann auslesen. Z.B. so:

telnet 192.168.0.1
cr
loginpasswort
cr
sh status
cr
quit
cr

Mit diesem Beispiel geht es nicht, schade...
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Warum bauste nicht einfach direkt ne Verbindung zum Router auf o_O?
Bild
Team100
Beiträge: 104
Registriert: 13.09.2004 22:59

Beitrag von Team100 »

@ 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
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
Icke
Beiträge: 143
Registriert: 08.09.2004 13:19

Beitrag von Icke »

>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...
Benutzeravatar
deMattin
Beiträge: 87
Registriert: 30.08.2004 13:36
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag von deMattin »

Probier's für telnet mal damit (nur Subroutine - also nicht direkt lauffähig:

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$
EndProcedure
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

und nochmal ein hinweis zu den begriffen:

ein Konsolenfenster ist kein DOSfenster...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Icke
Beiträge: 143
Registriert: 08.09.2004 13:19

Beitrag von Icke »

Thx @deMattin, das hat mir schon sehr geholfen...
Antworten