williewonka
Gebruiker
- Lid geworden
- 5 aug 2011
- Berichten
- 21
hallo allemaal,
Ik wil graag een programma maken die de output van de batch van de minecraft server 'vangt' en vervolgens aan de hand van deze output zelf commando's de batch insturen. Nou heb ik rond gezocht op google en een programma gevonden die eigenlijk een cmd prompt na-aapt. Het doet precies wat ik wil hebben. want als ik dit programma in de server map stop en de commandline geef om de server te starten ("java -Xmx2048M -Xms2048M -jar minecraft_server.jar" dit start ik normaal in een bat file) start hij keurig de server. De output wordt in het programma getoond en ik kan vanuit het programma commands geven. Maar nu het probleem: dit programma wil ik graag uitbreiden, het is echter geschreven in een oude versie ( ik denk 6 weet niet zeker) en ik heb versie 2008. Ik het het al geconverteerd met de wizard die bij visual basic wordt meegeleverd. de code is echter enorm veel rootzooi en er zit vele comments in het duits bij waar ik de helft niet van kan vertalen. Ik wil dit programma dus stroomlijnen en in 2008 programmeren. Ik heb een nieuw project gestart en alle belangrijke subs overgenomen (en overbodige dingetjes weggelaten die in 2008 niet hoeven zoals heel vaak een 'me.'). Ik heb nu dit in 2008:
En dit is de oude code:
ik krijg geen errors in visual basic. Als ik echter de programma's test draai krijg ik dit bij de oude:
en kan ik netjes dos commando's invoeren en krijg ik ook de output (minecraft server werkt ook)
maar als ik mijn programma draai krijg ik dit:
ik heb alles letter voor letter nagekeken en alle belangrijke code is hetzelfde. weet iemand wat ik fout doe? alvast hartelijk bedankt.
ps: ja ik heb gegoogled en nee ik kan de oude maker niet contacteren want het was een topic uit 2006 of zo en ik kan niet meer reageren.
Ik wil graag een programma maken die de output van de batch van de minecraft server 'vangt' en vervolgens aan de hand van deze output zelf commando's de batch insturen. Nou heb ik rond gezocht op google en een programma gevonden die eigenlijk een cmd prompt na-aapt. Het doet precies wat ik wil hebben. want als ik dit programma in de server map stop en de commandline geef om de server te starten ("java -Xmx2048M -Xms2048M -jar minecraft_server.jar" dit start ik normaal in een bat file) start hij keurig de server. De output wordt in het programma getoond en ik kan vanuit het programma commands geven. Maar nu het probleem: dit programma wil ik graag uitbreiden, het is echter geschreven in een oude versie ( ik denk 6 weet niet zeker) en ik heb versie 2008. Ik het het al geconverteerd met de wizard die bij visual basic wordt meegeleverd. de code is echter enorm veel rootzooi en er zit vele comments in het duits bij waar ik de helft niet van kan vertalen. Ik wil dit programma dus stroomlijnen en in 2008 programmeren. Ik heb een nieuw project gestart en alle belangrijke subs overgenomen (en overbodige dingetjes weggelaten die in 2008 niet hoeven zoals heel vaak een 'me.'). Ik heb nu dit in 2008:
Code:
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Globalization
Imports System.Text
Imports System.Threading
Imports System.Windows.Forms
Public Class console
Dim process As Process
Dim outputthread As Thread
Dim texttoadd As String
Dim errorthread As Thread
Private Sub streaminput(ByVal input As String)
process.StandardInput.WriteLine(Text)
process.StandardInput.Flush()
End Sub
Private Function ConvertFromOem(ByVal input As String) As String
Dim converted As String
converted = Encoding.GetEncoding(CultureInfo.InstalledUICulture.TextInfo.OEMCodePage).GetString(Encoding.Default.GetBytes(Text))
Return converted
End Function
Private Sub addtext(ByVal text As String)
texttoadd = text
Me.Invoke(CType(AddressOf addtexttotextbox, MethodInvoker))
End Sub
Private Sub addtexttotextbox()
txtoutput.AppendText(texttoadd & ControlChars.NewLine)
txtoutput.SelectionStart = txtoutput.Text.Length
End Sub
Private Sub streamoutput()
Dim line As String = process.StandardOutput.ReadLine
Try
Do While line.Length >= 0
If line.Length > 0 Then
addtext(ConvertFromOem(line))
End If
line = process.StandardOutput.ReadLine()
Loop
Catch
addtext("cmd prompt ended")
End Try
End Sub
Private Sub streamerror()
Dim line As String = process.StandardError.ReadLine()
Try
Do While line.Length >= 0
line = process.StandardError.ReadLine()
If line.Length > 0 Then
addtext(line)
End If
Loop
Catch
addtext("cmd prompt ended!")
MsgBox("cmd prompt ended!")
End Try
End Sub
Private Sub console_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If Not process.HasExited Then
process.Kill()
End If
process.Close()
End Sub
Private Sub console_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
process = New Process
With process.StartInfo
.FileName = "cmd"
.UseShellExecute = False
.CreateNoWindow = True
.RedirectStandardOutput = True
.RedirectStandardError = True
.RedirectStandardInput = True
End With
process.Start()
outputthread = New Thread(AddressOf streamoutput)
outputthread.IsBackground = True
outputthread.Start()
errorthread = New Thread(AddressOf streamerror)
errorthread.IsBackground = True
errorthread.Start()
End Sub
Private Sub btzenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btzenden.Click
streaminput(txtinput.Text)
txtinput.Clear()
End Sub
End Class
En dit is de oude code:
Code:
Option Compare Binary
Option Explicit On
Option Strict On
Imports Microsoft.VisualBasic
Imports System
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Globalization
Imports System.Text
Imports System.Threading
Imports System.Windows.Forms
''' <summary>
''' Hauptformular des Programms.
''' </summary>
Public Class MainForm
Inherits System.Windows.Forms.Form
Private m_Process As Process
Private m_OutputThread As Thread
Private m_ErrorThread As Thread
Private m_TextToAdd As String
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
InitializeComponent()
End Sub
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
Private components As System.ComponentModel.IContainer
Friend WithEvents txtCommandInput As System.Windows.Forms.TextBox
Friend WithEvents txtConsole As System.Windows.Forms.TextBox
Friend WithEvents btnSend As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.txtCommandInput = New System.Windows.Forms.TextBox
Me.btnSend = New System.Windows.Forms.Button
Me.txtConsole = New System.Windows.Forms.TextBox
Me.SuspendLayout()
'
'txtCommandInput
'
Me.txtCommandInput.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtCommandInput.Location = New System.Drawing.Point(16, 352)
Me.txtCommandInput.Name = "txtCommandInput"
Me.txtCommandInput.Size = New System.Drawing.Size(462, 20)
Me.txtCommandInput.TabIndex = 1
'
'btnSend
'
Me.btnSend.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.btnSend.FlatStyle = System.Windows.Forms.FlatStyle.System
Me.btnSend.Location = New System.Drawing.Point(486, 350)
Me.btnSend.Name = "btnSend"
Me.btnSend.Size = New System.Drawing.Size(64, 24)
Me.btnSend.TabIndex = 2
Me.btnSend.Text = "&Senden"
'
'txtConsole
'
Me.txtConsole.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtConsole.Font = New System.Drawing.Font("Courier New", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.txtConsole.Location = New System.Drawing.Point(16, 16)
Me.txtConsole.Multiline = True
Me.txtConsole.Name = "txtConsole"
Me.txtConsole.ReadOnly = True
Me.txtConsole.ScrollBars = System.Windows.Forms.ScrollBars.Both
Me.txtConsole.Size = New System.Drawing.Size(534, 326)
Me.txtConsole.TabIndex = 3
'
'MainForm
'
Me.AcceptButton = Me.btnSend
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(568, 390)
Me.Controls.Add(Me.txtConsole)
Me.Controls.Add(Me.btnSend)
Me.Controls.Add(Me.txtCommandInput)
Me.MinimumSize = New System.Drawing.Size(576, 424)
Me.Name = "MainForm"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "RedirectConsole"
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
#End Region
''' <summary>
''' Schreibt den im Parameter <paramref name="Text"/> angebenen Text
''' auf den Ausgabestrom.
''' </summary>
''' <param name="Text">
''' Text, der auf den Ausgabestrom geschrieben werden soll.
''' </param>
Private Sub StreamInput(ByVal Text As String)
m_Process.StandardInput.WriteLine(Text)
m_Process.StandardInput.Flush()
End Sub
''' <summary>
''' Konvertiert den Text in <paramref name="Text"/> von der DOS-
''' Codepage (OEM) in die Windows-Codepage (ANSI).
''' </summary>
''' <param name="Text">Text, der konvertiert werden soll.</param>
''' <returns>
''' Der Text aus <paramref name="Text"/> in der aktuellen Windows-
''' Codepage.
''' </returns>
Private Function ConvertFromOem(ByVal Text As String) As String
Return _
Encoding.GetEncoding( _
CultureInfo.InstalledUICulture.TextInfo.OEMCodePage _
).GetString(Encoding.Default.GetBytes(Text))
End Function
''' <summary>
''' Liest vom Ausgabestream und gibt die gelesenen Informationen aus.
''' </summary>
Private Sub StreamOutput()
Dim Line As String = m_Process.StandardOutput.ReadLine()
Try
Do While Line.Length >= 0
If Line.Length > 0 Then
AddText(ConvertFromOem(Line))
End If
Line = m_Process.StandardOutput.ReadLine()
Loop
Catch
AddText(String.Format("cmd prompt ended!", m_Process.StartInfo.FileName))
End Try
End Sub
''' <summary>
''' Liest vom Fehlerstream und gibt die gelesenen Informationen aus.
''' </summary>
Private Sub StreamError()
Dim Line As String = m_Process.StandardError.ReadLine()
Try
Do While Line.Length >= 0
Line = m_Process.StandardError.ReadLine()
If Line.Length > 0 Then
AddText(Line)
End If
Loop
Catch
AddText(String.Format("cmd prompt ended!", m_Process.StartInfo.FileName))
MsgBox("cmd prompt closed!")
End Try
End Sub
''' <summary>
''' Fügt den im Parameter <paramref name="Text"/> übergebenen String
''' einer TextBox an.
''' </summary>
''' <param name="Text">
''' Text, der der TextBox hinzugefügt werden soll.
''' </param>
Private Sub AddText(ByVal Text As String)
m_TextToAdd = Text
Me.Invoke(CType(AddressOf Me.AddTextToTextBox, MethodInvoker))
End Sub
''' <summary>
''' Wird über Invoking aufgerufen, um einen Text hinzuzufügen.
''' <summary>
Private Sub AddTextToTextBox()
Me.txtConsole.AppendText(m_TextToAdd & ControlChars.NewLine)
Me.txtConsole.SelectionStart = Me.txtConsole.Text.Length
End Sub
Private Sub MainForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
' Um das Programm zu benutzen, um einen Befehl auf der
' Konsole auszuführen (z.B. "netstat" oder "ping") kann man
' anstelle von "cmd" bei Arguments einfach den entsprechenden
' Befehl (z.B. "ping") einfügen und in der Eigenschaft 'Arguments'
' die entsprechenden Argumente (beispielsweise bei "ping" die IP-
' Adresse) angeben.
m_Process = New Process
With m_Process.StartInfo
.FileName = "cmd"
.UseShellExecute = False
.CreateNoWindow = True
.RedirectStandardOutput = True
.RedirectStandardError = True
.RedirectStandardInput = True
End With
m_Process.Start()
' Ändern der Datenströme, sodass wir bei Änderungen etwas mitbekommen.
m_OutputThread = New Thread(AddressOf StreamOutput)
m_OutputThread.IsBackground = True
m_OutputThread.Start()
m_ErrorThread = New Thread(AddressOf StreamError)
m_ErrorThread.IsBackground = True
m_ErrorThread.Start()
End Sub
Private Sub btnSend_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSend.Click
StreamInput(Me.txtCommandInput.Text)
Me.txtCommandInput.Clear()
End Sub
Private Sub MainForm_Closing(ByVal sender As Object, ByVal e As CancelEventArgs) Handles MyBase.Closing
If Not m_Process.HasExited Then
m_Process.Kill()
End If
m_Process.Close()
End Sub
End Class
ik krijg geen errors in visual basic. Als ik echter de programma's test draai krijg ik dit bij de oude:
Microsoft Windows [versie 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle rechten voorbehouden.
en kan ik netjes dos commando's invoeren en krijg ik ook de output (minecraft server werkt ook)
maar als ik mijn programma draai krijg ik dit:
mc_server_control
mc_server_control
ik heb alles letter voor letter nagekeken en alle belangrijke code is hetzelfde. weet iemand wat ik fout doe? alvast hartelijk bedankt.
ps: ja ik heb gegoogled en nee ik kan de oude maker niet contacteren want het was een topic uit 2006 of zo en ik kan niet meer reageren.